我有一段时间从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)}
Run Code Online (Sandbox Code Playgroud)
使用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>
Run Code Online (Sandbox Code Playgroud)
我已经看到了提琴手的银色光线,它确实向网站提出了请求,并确实获得了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
...
}
Run Code Online (Sandbox Code Playgroud)
我或多或少都没有想法.谁知道我做错了什么?直接从文件运行silverlight是否存在问题:// uri?
更新: 我删除了clientaccesspolicy.xml文件并保留了crossdomain.xml文件并且bingo一切正常.这让我相信错误发生在clientaccesspolicy文件中,但我直接从microsoft复制了它.是什么赋予了?
我花了3个小时调查这个问题.跨域访问策略和客户端访问策略文件对我来说是一个死胡同.什么都行不通.最后,我遇到了一位微软员工在Silverlight.net论坛上发帖,帮助我解决了这个问题.
答案,至少在我的例子中是Visual Studio在创建新的Silverlight应用程序时生成的测试网页.
基本上,当您启动Silverlight项目时,您会获得两个选项.第一个选项将在您运行应用程序时动态生成html页面.第二个选项将创建一个单独的ASP.NET项目,该项目将托管您的Silverlight应用程序.如果您选择第一个选项(动态测试页面),您将无法执行任何跨域请求,即使您的项目位于同一个框中,它也会以某种方式将此视为跨域调用并失败(我不知道为什么)
创建另一个Silverlight项目,选择第二个选项,然后移动您的XAML文件.这应该可以解决您的问题.