2010-12-17 232 views
0

我正在嘗試使用WebClient#DownloadStringAsync()來獲取http://www.yahoo.com的內容。但是,由於Silverlight不允許跨域調用,所以我得到了TargetInvocationException。我知道我們必須將clientaccesspolicy.xml和crossdomain.xml放入我們的Web服務器根目錄中,但只有在我對服務有控制權的情況下才有可能。目前Google不受我控制;),那麼我該如何處理它?Web客戶端問題

我已經做了一個解決方法,在我的Web應用程序中創建一個WCF服務,然後調用WebClient。這工作完美,但它是相當無效的。還有其他更好的方法嗎?

感謝提前:)

回答

1

Silverlight的跨域restricitions導致很多開發者實現的解決方法。如果你需要顯示HTML頁面,你應該看看Silverlight 4(WebBrowser)控件,儘管這似乎只在瀏覽器模式運行時才起作用。

如果需要通過內容來分析,你可以嘗試以下一些:

  1. 對於託管代碼解決方案,你已經實施代理服務是您最佳的選擇。

  2. 編寫一個返回此信息的Java小程序。 Silverlight可以採用JavaScript來訪問Java應用程序。這也是相反的,但有點難以設置。 (如果你需要更多的信息,請讓我知道)。

  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); 
    }}