【问题标题】:WebClient.DownloadStringAsync throwing Security Exception in SilverlightWebClient.DownloadStringAsync 在 Silverlight 中引发安全异常
【发布时间】:2010-11-24 10:19:57
【问题描述】:

第一次使用 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_DownloadStringCompleted 事件处理程序上设置断点并单击搜索按钮e.Error 时,总是等于没有消息的 System.Security.SecurityException 和带有“安全错误”消息的相同类型的内部异常.'.堆栈跟踪是:

在 System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, 对象状态)

在 System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

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

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

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

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

发生了什么事?

【问题讨论】:

  • 您解决了吗?我也有同样的问题

标签: c# silverlight webclient


【解决方案1】:

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

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

【讨论】:

  • 好吧,考虑到本教程在 digg 网站上,我很确定他们的服务器上有一个 crossdomain.xml。到底有没有发现?
  • services.digg.com/crossdomain.xml 看起来不像是格式良好的 crossdomain.xml 文件。
  • 这不是 crossdomain.xml 文件。显然,在使用 services.digg.com 时,它会将请求解释为 RESTful 方法并失败并出现令人困惑的错误。
【解决方案2】:

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

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

Silverlight ==> YourWebHost ==> Digg.com

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

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

对于 JavaScript 调用: http://developers.digg.com/response

Silverlight 桥接参考: http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx 演练: Silverlight 到 JavaScript: http://msdn.microsoft.com/en-us/library/cc221359(v=VS.95).aspx JavaScript 到 Silverlight: http://msdn.microsoft.com/en-us/library/cc221414(v=VS.95).aspx

【讨论】:

  • Digg 有一个跨域文件services.digg.com/crossdomain.xml 所以有什么想法为什么这不起作用?
  • 当您可以使用 Javascript 桥接绕过这些安全限制时,这些安全限制是不是有点牵强?
  • @GeorgeBirbilis- 我在回答中说过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多