2011-02-05 55 views
1

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

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

回答

1

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

+0

感谢Steve的回复,我自己也这么想。我用Fiddler强制使用Firefox - 当我点击http://127.0.0时。1:10000/clientaccesspolicy.xml在浏览器中,我通过Fiddler看到请求。我认为Silverlight代表浏览器处理网络请求,所以假设如果我在手动请求期间看到它,我会在SL提出请求时看到它。 –

+0

这就是它。当我通过[此工具](http://agazuredevstoreproxy.codeplex.com/)进行代理时,它可以在127.0.0.1上运行。奇怪的是,当通过Firefox直接获取而不是通过Firefox中的Silverlight获取时,针对127.0.0.1的行为不一致。 –

+0

我同意这很奇怪,因为我认为默认情况下Silverlight使用浏览器的HTTP堆栈。 – smarx