1

我在理解 Silverlight 下载 clientaccesspolicy.xml 文件的情况时遇到了一些麻烦。我对运行时环境有一些需要解释的复杂情况。

这是一个 Azure Web 应用,在开发结构中以完整的 IIS 模式运行。定义了两个站点,App 和 Admin。由于它们都在端口:80 上,因此可以通过主机头 app.dev.com 和 admin.dev.com 访问它们,它们在我的 HOSTS 文件中都有指向 127.0.0.1 的条目。访问这两个客户端应用程序工作正常。Silverlight 加载并点击定义的 RIA 服务,没问题。

当 Silverlight 客户端尝试从开发存储访问 blob 时,事情变得很棘手。这个问题之前已经解释过,所以我不会太深入——底线,你不能把 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";
}

并更改要下载到的 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。

谢谢你的帮助,这个让我难住了。

4

1 回答 1

1

Traffic to 127.0.0.1 usually skips the proxy, so I would imagine Fiddler simply wasn't getting the chance to rewrite the URL. You could probably point Silverlight at ipv4.fiddler instead and get it to work.

于 2011-02-05T18:54:39.553 回答