2010-12-17 2 views
0

http://www.yahoo.comの内容をWebClient#DownloadStringAsync()で取得しようとしています。しかし、Silverlightはクロスドメインコールを許可していないので、私はTargetInvocationExceptionを取得しています。 clientaccesspolicy.xmlとcrossdomain.xmlをWebサーバーのルートに配置する必要があることはわかっていますが、これは自分のサービスを制御できる場合にのみ可能です。現在のところ、Googleは私のコントロール下にありません;)、どうすれば対応できますか?WebClientの問題

WebアプリケーションでWCFサービスを作成し、WebClientを呼び出すことで回避策を実行しました。これは完璧に機能しますが、むしろ非効率です。これ以外の方法はありますか?事前に

感謝:)

答えて

1

シルバーのクロスドメインrestricitionsは、回避策を実装するために多くの開発者を引き起こします。戻るHTMLページを表示する必要がある場合、これはSilverlight 4(WebBrowser)コントロールを調べる必要がありますが、これはブラウザ外モードを実行している場合にのみ有効です。

あなたがコンテンツを解析する必要がある場合は、次のいくつか試すことができます:マネージコードソリューションについて

  1. をすでに実装したプロキシサービスは、あなたの最良の選択肢です。

  2. この情報を返すJavaアプレットを作成します。 SilverlightはJavaアプレットに組み込むことができるjavascriptに組み込むことができます。これは逆に動作しますが、設定するのは少し難しいです。 (これについてもっと知りたい場合は、私に知らせてください)。

  3. javascript XmlHttpRequestを使用して、ソースから必要なデータを取得します。これは、複数のブラウザをサポートする場合、難しい場合があります。このリンクは、これを行う方法の例を示しています(下にスクロールする必要があります)。 Javascript get Html

コード:

var xmlHttpRequestHandler = new Object(); 
var requestObject; 

xmlHttpRequestHandler.createXmlHttpRequest = function(){ 
var XmlHttpRequestObject; 
if(typeof XMLHttpRequest != "undefined") 
{ 
    XmlHttpRequestObject = new XMLHttpRequest(); 
} 
else if(window.ActiveXObject) 
{ 
    var tryPossibleVersions =["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp","Microsoft.XMLHttp"]; 
    for(i=0;i<tryPossibleVersions.length;i++) 
    { 
     try 
     { 
      XmlHttpRequestObject = new ActiveXObject(tryPossibleVersions[i]); 
      break; 
     } 
     catch(xmlHttpRequestObjectError) 
     { 
      // Ignore Exception 
     } 
    } 
} 
return XmlHttpRequestObject;} 

    function getHtml(){ 
    var url = document.getElementById('url').value; 
    if(url.length > 0) 
    { 
     requestObject = xmlHttpRequestHandler.createXmlHttpRequest(); 
     requestObject.onreadystatechange=onReadyStateChangeResponse; 
     requestObject.open("Get",url, true); 
     requestObject.send(null); 
    }} 
function onReadyStateChangeResponse(){ 
    var ready, status; 
    try 
    { 
     ready = requestObject.readyState; 
     status = requestObject.status; 
    } 
    catch(e) {} 
    if(ready == 4 && status == 200) 
    { 
     alert(requestObject.responseText); 
    }} 
関連する問題