2010-11-24 56 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