2011-02-05 54 views
1

我在理解Silverlight下載clientaccesspolicy.xml文件的情況時遇到了一些麻煩。我需要解釋的運行時環境有一些複雜性。Silverlight clientaccesspolicy.xml和Azure dev存儲

這是一個Azure Web應用程序,在dev結構中以完整的IIS模式運行。有兩個網站定義,應用程序和管理員。由於它們都在端口80上,因此它們可以通過主機頭文件app.dev.com和admin.dev.com訪問,它們都在我的HOSTS文件中具有指向127.0.0.1的條目。訪問這兩個客戶端應用程序工作正常。 Silverlight加載,並擊中定義的RIA服務,沒有問題。

當Silverlight客戶端嘗試從dev存儲訪問blob時,事情會變得棘手。 problem has been explained before所以我不會太深入底線,因爲dev存儲的工作方式(它可以到http://127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml),所以不能將XML文件放在Web的根目錄中。該解決方案是重新映射URL的反向代理 - 我用Fiddler rule完成了它。這樣做是「如果一個請求進入127.0.0.1:11000,修改請求:10000和獲取,而不是」等

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> 

那麼這從Silverlight客戶端在訪問http://app.dev.com:81/default.aspx失敗(這要提醒你,重新映射主機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) 

展望提琴手的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"; 
} 

和改變URL下載到

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

而這一次成功! Fiddler捕獲顯示首先下載的clientaccesspolicy.xml文件,其次顯示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。

感謝您的幫助,這一個讓我難住。

回答

1

到127.0.0.1的流量通常會跳過代理,所以我想Fiddler根本沒有機會重寫URL。你也許可以將Silverlight指向ipv4.fiddler,然後讓它工作。

+0

感謝Steve的回覆,我自己也這麼想。我用Fiddler強制使用Firefox - 當我點擊http://127.0.0時。1:10000/clientaccesspolicy.xml在瀏覽器中,我通過Fiddler看到請求。我認爲Silverlight代表瀏覽器處理網絡請求,所以假設如果我在手動請求期間看到它,我會在SL提出請求時看到它。 –

+0

這就是它。當我通過[此工具](http://agazuredevstoreproxy.codeplex.com/)進行代理時,它可以在127.0.0.1上運行。奇怪的是,當通過Firefox直接獲取而不是通過Firefox中的Silverlight獲取時,針對127.0.0.1的行爲不一致。 –

+0

我同意這很奇怪,因爲我認爲默認情況下Silverlight使用瀏覽器的HTTP堆棧。 – smarx