2011-02-05 17 views
1

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をダウンロードしてからブロブをダウンロードします。

私は助けてくれてありがとうございました。

答えて

1

127.0.0.1へのトラフィックは、通常、プロキシをスキップするので、Fiddlerは単にURLを書き換えるチャンスを得られなかったと思います。あなたはおそらく代わりにipv4.fiddlerでSilverlightを指し、それを動作させることができます。

+0

返信ありがとうSteve、私は自分自身の考えを持っていました。私はFiddlerが強制的にFirefoxを使用しています - そして、http://127.0.0を押すと。1:10000/clientaccesspolicy.xmlをブラウザに表示すると、Fiddlerを介して要求が表示されます。私はSilverlightがブラウザの代わりにネットワーク要求を処理していると思っていたので、私が手動要求中にそれを見た場合、SLが要求を出したときに表示されます。 –

+0

そうでなければなりません。 [this tool](http://agazuredevstoreproxy.codeplex.com/)でプロキシすると、127.0.0.1以上で動作します。奇妙なことに、127.0.0.1に対する動作は、Firefoxを介して直接Firefoxに対してSilverlightを介してフェッチされると、一貫性がありません。 –

+0

SilverlightがデフォルトでブラウザのHTTPスタックを使用していると思っていたので、私はそれが奇妙なことに同意します。 – smarx

関連する問題