1

Silverlightがclientaccesspolicy.xmlファイルをダウンロードする状況を理解するのに問題があります。ランタイム環境には、説明が必要ないくつかの問題があります。

これはAzureWebアプリであり、開発ファブリックで完全なIISモードで実行されます。AppとAdminの2つのサイトが定義されています。どちらもポート:80にあるため、ホストヘッダーapp.dev.comとadmin.dev.comを介してアクセスされます。どちらも、私のHOSTSファイルに127.0.0.1を指すエントリがあります。両方のクライアントアプリへのアクセスは正常に機能しています。Silverlightが読み込まれ、定義されたRIAサービスにヒットします。問題ありません。

Silverlightクライアントが開発ストレージからBLOBにアクセスしようとすると、事態は複雑になります。この問題は以前に説明されているので、あまり深くは説明しません。つまり、開発ストレージの仕組みが原因で、XMLファイルをWebのルートに配置することはできません(http://127.0.0.1に移動します)。 :10000 / devstoreaccount1 / clientaccesspolicy.xml)。解決策は、URLを再マップするためのリバースプロキシです。私はFiddlerルールを使用してこれを実行しました。これは、「リクエストが127.0.0.1:11000で受信された場合、そのリクエストを:10000に変更し、代わりにGETする」などです。

if (oSession.host == "127.0.0.1:11000") {
  oSession.host = "127.0.0.1:10000";
}
if (oSession.url == "127.0.0.1:10000/clientaccesspolicy.xml") {
  oSession.url = "127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml";
}

これは、再マッピングに関する限り機能します。ブラウザでhttp://127.0.0.1:11000/clientaccesspolicy.xmlにアクセスして、ファイルを実際に127.0.0.1:10000 / devstoreaccount1/clientaccesspolicy.xmlに配置できます。

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-methods="*" http-request-headers="*">
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true" />
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

次に、これはhttp://app.dev.com:81/default.aspxでアクセスされたSilverlightクライアントから失敗します(これは、HOSTSでは127.0.0.1に再マップされます)

private void DownloadFile()
{
    var sampleUri = new Uri("http://127.0.0.1:11000/devstorageaccount1/mycontainer/myblob.bin");
    var client = new WebClient();
    client.OpenReadCompleted += blobDownloaded;
    client.OpenReadAsync(sampleUri);
}
void blobDownloaded(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error != null) throw e.Error;
    //throws
}

例外を除いて

System.Security.SecurityException ---> System.Security.SecurityException: Security error.
at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)

Fiddlerを見ると、clientaccesspolicy.xmlファイルがダウンロードされていません。理由やデバッグ方法がわかりません。ブラウザからblobをダウンロードできます。XMLファイルをダウンロードする前にこれがスローされる理由を誰かが説明できますか?

次に、これらのFiddlerルールを更新してみました。

if (oSession.host == "app.dev.com:10000") {
    oSession.host = "127.0.0.1:10000";
}
if (oSession.url == "127.0.0.1:10000/clientaccesspolicy.xml") {
    oSession.url = "127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml";
}

ダウンロードするURLを変更します

var sampleUri = new Uri("http://app.dev.com:10000/devstorageaccount1/mycontainer/myblob.bin");

そしてこれは成功します!Fiddlerキャプチャは、最初にダウンロードされたclientaccesspolicy.xmlファイルと、2番目にダウンロードされたblobを示しています。

誰かがここで何が起こっているのか説明するのを手伝ってもらえますか?どちらの場合も、Silverlightアプリはhttp://app.dev.com:81/default.aspxでアクセスされています。http://127.0.0.1:11000からblobをダウンロードしようとすると、最初にclientaccesspolicy.xmlをダウンロードせずに、SecurityExceptionで失敗します。ただし、http: //app.dev.com:10000からblobをダウンロードすると成功し、最初にclientaccesspolicy.xmlをダウンロードし、次にblobをダウンロードします。

助けてくれてありがとう、これは私を困惑させました。

4

1 に答える 1

1

127.0.0.1 へのトラフィックは通常、プロキシをスキップするため、Fiddler が URL を書き換える機会がなかっただけだと思います。代わりに、Silverlight を ipv4.fiddler に向けて動作させることができます。

于 2011-02-05T18:54:39.553 に答える