2010-12-17 188 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); 
    }}