在Silverlight中使用Web客户端

时间:2009-04-20 01:05:15

标签: silverlight

我有一段时间从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复制了该文件。是什么赋予了?

4 个答案:

答案 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。)