我在理解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