首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Silverlight clientaccesspolicy.xml和Azure dev存储器

Silverlight clientaccesspolicy.xml和Azure dev存储器
EN

Stack Overflow用户
提问于 2011-02-05 16:03:45
回答 1查看 1.8K关注 0票数 1

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

这是一个Azure web应用程序,在dev fabric中以完全IIS模式运行。有两个网站的定义,应用程序和管理。因为它们都位于端口:80上,所以可以通过主机头( app.dev.com和admin.dev.com )访问它们,它们都在我的主机文件中有指向127.0.0.1的条目。访问两个客户端应用程序运行良好。Silverlight加载,并访问定义的RIA服务,没有问题。

当Silverlight客户端试图从dev存储中访问blob时,事情变得很棘手。问题以前已经解释过了 --所以我不会说得太深--底线是,您不能将XML文件放在web的根目录中,因为开发存储是如何工作的(它转到http://127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml)。解决方案是一个反向代理来重新映射URL--我是用一个Fiddler规则完成的。这样做的目的是“如果一个请求传入127.0.0.1:11000,将该请求修改为:10000,然后得到它,”等等。

代码语言:javascript
复制
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,并使文件实际驻留在http://127.0.0.1:11000/clientaccesspolicy.xml上。

代码语言:javascript
复制
<?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客户端(提醒您,主机中的内存为127.0.0.1 )发生了故障。

代码语言:javascript
复制
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
}

例外

代码语言:javascript
复制
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规则:

代码语言:javascript
复制
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更改为

代码语言:javascript
复制
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。

谢谢你的帮助,这件事让我很为难。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-05 18:54:39

流量到127.0.0.1通常跳过代理,所以我可以想象Fiddler根本没有机会重写URL。您可能可以将Silverlight指向ipv4。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4907916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档