我有一段时间从Silverlight内部调用RESTful服务.我遇到这个错误:
{System.Security.SecurityException ---> System.Security.SecurityException: Security error. at System.Net.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.BrowserHttpWebRequest.<>c__DisplayClass5.b__4(Object sendState) at System.Net.AsyncHelper.<>c__DisplayClass2. 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
我已经看到了提琴手的银色光线,它确实向网站提出了请求,并确实获得了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复制了它.是什么赋予了?
我花了3个小时调查这个问题.跨域访问策略和客户端访问策略文件对我来说是一个死胡同.什么都行不通.最后,我遇到了一位微软员工在Silverlight.net论坛上发帖,帮助我解决了这个问题.
答案,至少在我的例子中是Visual Studio在创建新的Silverlight应用程序时生成的测试网页.
基本上,当您启动Silverlight项目时,您会获得两个选项.第一个选项将在您运行应用程序时动态生成html页面.第二个选项将创建一个单独的ASP.NET项目,该项目将托管您的Silverlight应用程序.如果您选择第一个选项(动态测试页面),您将无法执行任何跨域请求,即使您的项目位于同一个框中,它也会以某种方式将此视为跨域调用并失败(我不知道为什么)
创建另一个Silverlight项目,选择第二个选项,然后移动您的XAML文件.这应该可以解决您的问题.