Silverlight clientaccesspolicy.xml和Azure dev存储

时间:2011-02-05 16:03:46

标签: silverlight azure cross-domain azure-storage-blobs

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

感谢您的帮助,这个让我难过。

1 个答案:

答案 0 :(得分:1)

流量到127.0.0.1通常会跳过代理,所以我想Fiddler根本没有机会重写URL。您可以将Silverlight指向ipv4.fiddler,然后让它工作。