C# WebClient.DownloadStringAsync在Silverlight中引发安全异常

C# WebClient.DownloadStringAsync在Silverlight中引发安全异常,c#,silverlight,webclient,C#,Silverlight,Webclient,第一次使用Silverlight!在线教程之后。我正在创建一个应用程序,允许用户使用WebClient从Digg网站搜索故事,并在Silverlight控件的数据网格中显示它们 代码如下: private void btnSearch_Click(object sender, RoutedEventArgs e) { string topic = txtTopic.Text; string diggUrl = String.Format("http://services.dig

第一次使用Silverlight!在线教程之后。我正在创建一个应用程序,允许用户使用WebClient从Digg网站搜索故事,并在Silverlight控件的数据网格中显示它们

代码如下:

private void btnSearch_Click(object sender, RoutedEventArgs e)
{
    string topic = txtTopic.Text;

    string diggUrl = String.Format("http://services.digg.com/stories/topic/{0}?count=20&appkey=http%3A%2F%2Fscottgu.com", topic);

    WebClient diggService = new WebClient();
    diggService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(diggService_DownloadStringCompleted);
    diggService.DownloadStringAsync(new Uri(diggUrl));
}

void diggService_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error == null)
    {
        DisplayStories(e.Result);
    }
}
每当我在
diggService\u DownloadStringCompleted
事件处理程序上放置断点,并单击搜索按钮
e.Error
时,始终等于System.Security.SecurityException(无消息)和同一类型的内部异常(消息为“Security Error”)。堆栈跟踪是:

位于System.Net.Browser.AsyncHelper.BeginNoui(SendOrPostCallback beginMethod,对象状态)

位于System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

在System.Net.WebClient.GetWebResponse(WebRequest请求,IAsyncResult结果)

在System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult结果)

在谷歌搜索了一番之后,我看到人们提到了一个crossdomain.xml文件。不完全确定这是什么,但我在运行Silverlight控件any的web服务器的根目录中添加了一个,并添加了以下文本。没有任何区别:

<?xml version="1.0" ?>
<cross-domain-policy>
  <allow-access-from domain="*" />
</cross-domain-policy>


发生了什么?

crossdomain.xml文件需要放在您试图从中下载文件的服务器上,而不是放在为Silverlight应用程序提供服务的服务器上


如果服务器没有crossdomain.xml文件,Silverlight运行时将不允许应用程序从该服务器下载数据。默认情况下,它只能访问从中下载的服务器(同源策略)。

Digg.com没有跨域文件(这意味着Silverlight和Flash客户端无法直接使用API)。无法从Silverlight直接访问

解决方法之一是在web主机上创建代理。代理将从web服务器而不是直接从Silverlight客户端调用Digg的API

Silverlight==>YourWebHost==>Digg.com

另一个解决方法是使用他们的JavaScript API,然后使用JavaScript桥从Silverlight与JavaScript通信

Silverlight==>JavaScript==>Digg.Com==>JavaScript==>Silverlight

对于JavaScript调用:

银光桥参考: 演练: Silverlight到JavaScript: 从JavaScript到Silverlight:

好吧,考虑到本教程在digg网站上,我很确定他们的服务器上会有一个crossdomain.xml。到底有没有发现的可能?看起来不像格式良好的crossdomain.xml文件。它不是crossdomain.xml文件。显然,当使用services.digg.com时,它将请求解释为RESTful方法,并以一个令人困惑的错误失败。您解决了这个问题吗?我也遇到了同样的问题Digg有一个跨域文件,所以你知道为什么这不起作用吗?当你可以使用Javascript桥绕过这些安全限制时,这些安全限制不是有点牵强吗?@GeorgeBirbilis-我在回答中说过。