Silverlight安全异常

5
我正在向服务器POST数据,并成功执行了BeginGetRequestStream,然后是EndGetRequestStream,将我的POST数据写入请求流(RequestStream),并调用BeginGetResponse。
BeginGetResponse成功返回,然后我调用:
Dim response As HttpWebResponse = CType(MyHttpRequest.EndGetResponse(asynchronousResult), HttpWebResponse)

这行代码会抛出以下SecurityException错误:
{System.Security.SecurityException ---> System.Security.SecurityException: Security error. at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.b__4(Object sendState) at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.b__0(Object sendState) --- End of inner exception stack trace --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at EtsyV2NetSL.WebQuery.POST_ResponseCallback(IAsyncResult asynchronousResult)}
因此,我首先想到的是服务器通过其clientaccesspolicy.xml或crossdomain.xml阻止了我的请求。我启动了Fiddler并看到以下内容:
GET http://openapi.etsy.com/clientaccesspolicy.xml > 596 (text/xml)
GET http://openapi.etsy.com/crossdomain.xml > 200 OK (application/xml)

所以我检查了他们的crossdomain.xml文件,设置看起来没问题:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*"/>
</cross-domain-policy>

我在尝试解决这个问题时遇到了瓶颈。我正在使用VS从我的开发机器上运行测试应用程序。

是否有人知道为什么Silverlight会抛出这个错误?

谢谢!

2个回答

1
今天我遇到了一个非常类似的问题 - 不过与HTTP POST不同,我试图进行WCF服务调用。
这是我在代码中放置的注释 - 如果不够清晰以便有所帮助,请告诉我。
// NB: Cross-domain bug
// If you end up here with a System.Security.SecurityException "Security error."
// Check that you're not trying to cross zones when making a service call
// (eg: Accessing Trigger Driver TimeSource service on http://IASWEB01/ when accessing the site via usertest.local
//  or any other URI with dots in it - yes it seems crazy)

这似乎是一些安全“特性”。在 WCF 调用中,我甚至在 Silverlight 客户端尝试从目标主机获取 clientaccesspolicy.xml 之前就遇到了这个异常。这是一个非常恼人的问题,而且没有明显的解决方案!


从我的Fiddler跟踪结果可以看出,Silverlight检查并找到了一个“向后兼容”的策略文件。因此,我可以轻松地在不同域之间发出GET命令。然而,我正在与第三方公司合作,对使用的策略文件没有控制权。我使用的代码在WinForms/ASP.NET/WPF上运行良好;我为Silverlight调整了代码,但是遇到了安全异常错误。从Silverlight中看来,它的发送很好,但在获取响应时出错,然而在查找时没有找到所提交的数据。因此,POST/PUT方法会引发安全异常。 - Graeme
你能在Fiddler中看到POST请求吗?在我看来,问题似乎与此相关,即在HTTP请求完成之前或者完全构建之前就出现了故障。 - maltem-za
1
Fiddler没有捕获POST请求-因此无法确定。 - Graeme

1

是的,在clientaccesspolicy.xml文件中的"<allow-from http-request-headers="*">"语句解决了我的问题。感谢您的帮助! - Dimitri C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接