我在理解Silverlight下载clientaccesspolicy.xml文件的情况时遇到了一些麻烦。我对需要解释的运行时环境有一些复杂性。
这是一个Azure网络应用,在开发结构中以完整的IIS模式运行。定义了两个站点,App和Admin。由于它们都在端口:80,它们是通过主机头app.dev.com和admin.dev.com访问的,两者都有我的HOSTS文件中的条目,指向127.0.0.1。访问这两个客户端应用程序工作正常。 Silverlight加载并点击定义的RIA服务,没问题。
当Silverlight客户端尝试从dev存储访问blob时,事情变得棘手。 problem has been explained before所以我不会太深入 - 底线,你不能把XML文件放在web的根目录中,因为dev存储的工作方式(它转到http://127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml)。该解决方案是重新映射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>
然后从http://app.dev.com:81/default.aspx访问的Silverlight客户端失败(提醒您,在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
}
有例外
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)
查看Fiddler,未下载clientaccesspolicy.xml文件!我不知道为什么,或者如何调试它。我可以从浏览器下载blob。谁能解释为什么在下载XML文件之前会抛出这个?
然后我尝试更新那些Fiddler规则:
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");
这个成功了! Fiddler捕获显示首先下载的clientaccesspolicy.xml文件和第二个blob。
任何人都可以帮忙解释这里发生了什么吗?在这两种情况下,Silverlight应用都可以在http://app.dev.com:81/default.aspx访问。当它尝试从http://127.0.0.1:11000下载blob时,它失败并显示SecurityException ,而首先下载clientaccesspolicy.xml。但是当它从http://app.dev.com:10000下载blob时,它会成功,首先下载clientaccesspolicy.xml然后下载blob。
感谢您的帮助,这个让我难过。
答案 0 :(得分:1)
流量到127.0.0.1通常会跳过代理,所以我想Fiddler根本没有机会重写URL。您可以将Silverlight指向ipv4.fiddler,然后让它工作。