2010-11-24 12 views
2

初めてSilverlightを使用する!オンラインチュートリアルに続いて。私はWebClientを使ってDiggのWebサイトからストーリーを検索し、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イベントハンドラにブレークポイントを置き、常にメッセージと同じの内部例外なしでSystem.Security.SecurityExceptionに等しいe.Error検索ボタンをクリックするたびに「セキュリティエラー」というメッセージが表示されます。システムでSystem.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod、オブジェクトの状態)で

System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(たIAsyncResult asyncResult)で

:スタックトレースであります私はpeoplを見てきたいくつかの重いグーグル後System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResultインター結果)で.Net.WebClient.GetWebResponse(WebRequestクラス要求、IAsyncResultインター結果)

eはcrossdomain.xmlファイルに言及します。これが何であるかは完全にはわかりませんが、Silverlightコントロールanyを実行しているWebサーバーのルートディレクトリに1を追加し、次のテキストを追加しました。違いはありませんでした:

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

どうしていますか?

+0

これを解決しましたか?私は同じ問題を抱えています – Andrew

答えて

2

Crossdomain.xmlファイルは、Silverlightアプリケーションを提供するサーバーではなく、ファイルをダウンロードしようとしているサーバー上に配置する必要があります。

サーバーにcrossdomain.xmlファイルがない場合、Silverlightランタイムはアプリケーションがそのサーバーからデータをダウンロードすることを許可しません。デフォルトでは、ダウンロード元のサーバ(同じオリジンポリシー)にのみアクセスできます。

+0

よくこのチュートリアルはdiggのウェブサイト上にあると考えています。私は彼らがサーバ上にcrossdomain.xmlを持っていると確信しています。とにかく見つけ出すのですか? –

+0

http://services.digg.com/crossdomain.xmlはwell-formed crossdomain.xmlファイルのようには見えません。 – dtb

+0

これはcrossdomain.xmlファイルではありません。どうやら、services.digg.comを使用しているとき、リクエストをRESTfulメソッドとして解釈していて、混乱するエラーで失敗します。 – WiredPrairie

0

Digg.comにはクロスドメインファイルがありません(つまり、SilverlightとFlashクライアントはAPIを直接使用できません)。 Silverlightからの直接アクセスはできません。

あなたのウェブホストにプロキシを作成することで回避できます。プロキシはSilverlightクライアントから直接ではなく、WebサーバーからDiggのAPIを呼び出します。

シルバー==> YourWebHost ==> Digg.com

別の回避策は、代わりに自分のJavaScriptのAPIを使用して、SilverlightのからJavaScriptに通信するためにはJavaScriptブリッジを使用することです。

Silverlight ==> JavaScript ==> Digg。JavaScript呼び出しのCOM ==> JavaScriptの==>シルバー

http://developers.digg.com/response

シルバーブリッジ参照: http://msdn.microsoft.com/en-us/library/cc645076(VS.95).aspx チュートリアル:JavaScriptに シルバー:シルバーへ http://msdn.microsoft.com/en-us/library/cc221359(v=VS.95).aspx はJavaScript: http://msdn.microsoft.com/en-us/library/cc221414(v=VS.95).aspx

+0

Diggにはcrossdomainファイルhttp://services.digg.com/crossdomain.xmlがあります。なぜこれがうまくいかないのでしょうか? – Andrew

+0

は、Javascriptブリッジを使用してそれらをバイパスすることができるときに、これらのセキュリティ制限が少し遠くまでフェッチされるわけではありませんか? –

+0

@ GeorgeBirbilis-私は私の答えでそれを言った。 – WiredPrairie

関連する問題