我在理解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。
感謝您的幫助,這一個讓我難住。
感謝Steve的回覆,我自己也這麼想。我用Fiddler強制使用Firefox - 當我點擊http://127.0.0時。1:10000/clientaccesspolicy.xml在瀏覽器中,我通過Fiddler看到請求。我認爲Silverlight代表瀏覽器處理網絡請求,所以假設如果我在手動請求期間看到它,我會在SL提出請求時看到它。 –
這就是它。當我通過[此工具](http://agazuredevstoreproxy.codeplex.com/)進行代理時,它可以在127.0.0.1上運行。奇怪的是,當通過Firefox直接獲取而不是通過Firefox中的Silverlight獲取時,針對127.0.0.1的行爲不一致。 –
我同意這很奇怪,因爲我認爲默認情況下Silverlight使用瀏覽器的HTTP堆棧。 – smarx