2010-11-24 60 views
2

第一次使用Silverlight!遵循在线教程。我创建的应用程序允许用户使用WebClient从Digg网站搜索故事,并将它们显示在Silverlight控件的数据网格中。WebClient.DownloadStringAsync在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)

在系统.Net.WebClient.GetWebResponse(WebRequest的要求,IAsyncResult的结果)

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

后有些沉重谷歌上搜索我见过peopl提及一个crossdomain.xml文件。不完全确定这是什么,但我添加了一个到运行Silverlight控件的Web服务器的根目录并添加了以下文本。没有任何区别:

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

这是怎么回事?

+0

你解决了这个问题吗?我有同样的问题 – Andrew 2011-06-09 10:11:33

回答

2

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

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

+0

好吧,考虑到这个教程是在digg网站上,我很确定他们的服务器上会有一个crossdomain.xml。无论如何发现? – 2010-11-24 10:28:54

+0

http://services.digg.com/crossdomain.xml看起来不像格式良好的crossdomain.xml文件。 – dtb 2010-11-24 10:29:58

0

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

一个解决办法是在您的虚拟主机上做一个代理。代理将从您的Web服务器调用Digg的API,而不是直接从Silverlight客户端调用。

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