我有一段时间从Silverlight内部调用RESTful服务。我遇到了这个错误:
{System.Security.SecurityException ---> System.Security.SecurityException: Security error.
at System.Net.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
at System.Net.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)
--- End of inner exception stack trace ---
at System.Net.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)
at System.Net.WebClient.OpenReadAsyncCallback(IAsyncResult result)}
使用webclient时,这似乎是一个流行的错误。我已经实现了clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*" />
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true" />
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
我已经看到了提琴手中的银色灯光,它确实向网站提出了请求并确实获得了200状态。
public void login(string userName, string password)
{
WebClient client = new WebClient();
Uri uri = new Uri(serverURI + "/clientaccesspolicy.xml");
client.OpenReadCompleted += new OpenReadCompletedEventHandler(login_Complete);
client.OpenReadAsync(uri);
}
private void login_Complete(object sender, OpenReadCompletedEventArgs e)
{
byte[] buffer = new byte[e.Result.Length]; //crashes here with exception
...
}
我或多或少都没有想法。谁知道我做错了什么?直接从文件运行silverlight是否存在问题:// uri?
更新:我删除了clientaccesspolicy.xml文件并保留了crossdomain.xml文件并且bingo一切正常。这让我相信错误发生在clientaccesspolicy文件中,但我直接从microsoft复制了该文件。是什么赋予了?
答案 0 :(得分:5)
我花了3个小时研究这个问题。跨域访问策略和客户端访问策略文件对我来说是一个死胡同。什么都行不通。最后,我在一位微软员工的Silverlight.net论坛上发帖,帮助我解决了这个问题。
答案,至少在我的情况下是Visual Studio在您创建新的Silverlight应用程序时生成的测试网页。
基本上,当您启动Silverlight项目时,您会获得两个选项。第一个选项将在您运行应用程序时动态生成html页面。第二个选项将创建一个单独的ASP.NET项目,该项目将托管您的Silverlight应用程序。如果您选择第一个选项(动态测试页面),您将无法执行任何跨域请求,即使您的项目位于同一个框中,它也会以某种方式将此视为跨域调用并失败(我不知道为什么)
创建另一个Silverlight项目,选择第二个选项,然后移动您的XAML文件。这应该可以解决您的问题。
答案 1 :(得分:3)
如果您的Silverlight应用程序是从file:// URL运行,则无法从网站请求内容。
有关详细信息,请参阅URL Access Restrictions in Silverlight。
答案 2 :(得分:0)
嗯...
尝试使用此跨域文件
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction" >
<domain uri="*"/>
</allow-from>
<grant-to>
<resource include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
答案 3 :(得分:0)
X-Cubed是正确的,您无法从file://执行跨域请求,正如Adam Berent所指出的,这意味着如果您使用Visual Studio生成的TestPage,您的网络请求将会失败。
解决方法是使用Chiron(通常用于动态语言)来启动TestPage(因为这时访问位于http://)或者从开发Web服务器上运行。
实际上,您需要手动将调试器附加到浏览器以便通过网络进行调试(您不能只是点击F5。)