Silverlightがclientaccesspolicy.xmlファイルをダウンロードする状況を理解する上で、いくつか問題があります。私は説明が必要なランタイム環境にいくつかの問題があります。Silverlight clientaccesspolicy.xmlとAzure dev storage
これはdevファブリックでIISモードで実行されているAzure Webアプリケーションです。 AppとAdminの2つのサイトが定義されています。彼らは両方ともポート80上にあるので、ホストヘッダーapp.dev.comとadmin.dev.comを介してアクセスされます。両方とも、HOSTSファイルのエントリは127.0.0.1を指しています。両方のクライアントアプリにアクセスするとうまくいきます。 Silverlightがロードされ、定義されたRIAサービスには問題はありません。
Silverlightクライアントがdevストレージからブロブにアクセスしようとすると、処理が煩雑になります。 problem has been explained before私はあまりにも深刻には行きません - 最終的には、devのストレージの仕組み(これはhttp://127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xmlになります)のためにXMLファイルをWebのルートに置くことはできません。解決策は、URLを再マップするためのリバースプロキシです - 私はFiddler ruleで完了しました。これは、限り再マッピングが懸念しているように動作
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";
}
など:「10000、代わりにそれをGETリクエストが127.0.0.1:11000のために来た場合に、その要求を変更する」、これが何をするかであります私は私のブラウザで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のクライアントから失敗(あなたを思い出させるためにどの、あります例外
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)
付き)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
}
、フィドラーにclientaccesspolicy.xmlファイルを探していましたダウンロードしていない!私はなぜ、どのようにデバッグするのか分かりません。ブラウザからBLOBをダウンロードできます。 XMLファイルをダウンロードする前になぜこれがスローされるのか誰にも説明できますか?
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";
}
と
var sampleUri = new Uri("http://app.dev.com:10000/devstorageaccount1/mycontainer/myblob.bin");
にダウンロードして、この1つが成功するためにURLを変更:
は、その後、私はそれらのフィドラーのルールを更新してみました! Fiddlerのキャプチャは、最初にダウンロードされたclientaccesspolicy.xmlファイルとblobを最初に表示します。
誰でもここで起こっていることを説明できますか?どちらの場合も、Silverlightアプリはhttp://app.dev.com:81/default.aspxにアクセスしています。 http://127.0.0.1:11000からブロブをダウンロードしようとすると、SecurityException で失敗し、が最初にダウンロードされずにclientaccesspolicy.xmlがダウンロードされます。しかし、http://app.dev.com:10000からブロブをダウンロードすると、最初にclientaccesspolicy.xmlをダウンロードしてからブロブをダウンロードします。
私は助けてくれてありがとうございました。
返信ありがとうSteve、私は自分自身の考えを持っていました。私はFiddlerが強制的にFirefoxを使用しています - そして、http://127.0.0を押すと。1:10000/clientaccesspolicy.xmlをブラウザに表示すると、Fiddlerを介して要求が表示されます。私はSilverlightがブラウザの代わりにネットワーク要求を処理していると思っていたので、私が手動要求中にそれを見た場合、SLが要求を出したときに表示されます。 –
そうでなければなりません。 [this tool](http://agazuredevstoreproxy.codeplex.com/)でプロキシすると、127.0.0.1以上で動作します。奇妙なことに、127.0.0.1に対する動作は、Firefoxを介して直接Firefoxに対してSilverlightを介してフェッチされると、一貫性がありません。 –
SilverlightがデフォルトでブラウザのHTTPスタックを使用していると思っていたので、私はそれが奇妙なことに同意します。 – smarx