WebClient问题

时间:2010-12-17 15:28:58

标签: silverlight

我正在尝试使用http://www.yahoo.com获取WebClient#DownloadStringAsync()的内容。但是,由于Silverlight不允许跨域调用,因此我收到了TargetInvocationException。我知道我们必须在我们的Web服务器根目录中放置clientaccesspolicy.xml和crossdomain.xml,但只有在我控制了我的服务时才有可能。目前Google不在我的控制范围内;),我该如何处理?

我已经通过在我的Web应用程序中创建WCF服务然后调用WebClient来解决了这个问题。这完美无缺,但却相当无效。还有比这更好的方法吗?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

Silverlight的跨域限制导致许多开发人员实施变通方法。如果你需要显示你回来的html页面,你应该看看Silverlight 4(WebBrowser)控件,虽然这只在浏览器模式外运行时才有效。

如果您需要解析内容,可以尝试以下某些操作:

  1. 对于托管代码解决方案,您已实施的代理服务是您的最佳选择。

  2. 编写一个返回此信息的Java小程序。 Silverlight可以互操作到可以插入Java applet的javascript。这也可以反过来但有点难以设置。 (如果您需要更多信息,请告诉我。)

  3. 使用javascript XmlHttpRequest从源中获取所需的数据。支持多个浏览器时,这可能很困难。此链接显示了如何执行此操作的示例(您需要向下滚动)。 Javascript get Html

  4. 代码:

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