首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebClient问题

WebClient问题
EN

Stack Overflow用户
提问于 2010-12-17 23:28:58
回答 1查看 365关注 0票数 0

我正在尝试使用WebClient#DownloadStringAsync()获取http://www.yahoo.com的内容。然而,由于Silverlight不允许跨域调用,所以我选择了TargetInvocationException。我知道我们必须将clientaccesspolicy.xml和crossdomain.xml放在我们的web服务器根目录中,但只有当我对我的服务有控制权时,这才是可能的。目前Google不在我的控制之下;),那么我该如何处理它呢?

我已经做了一个变通方法,在我的web应用程序中创建一个WCF服务,然后调用WebClient。这是完美的,但它是相当无效的。还有比这更好的方法吗?

提前感谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-24 03:00:08

Silverlight的跨域约束导致许多开发人员实现变通方法。如果您需要显示返回的html页面,您应该查看Silverlight4 (WebBrowser)控件,尽管这似乎只在运行浏览器外模式时有效。

如果您需要解析内容,可以尝试以下一些方法:

  1. 对于托管代码解决方案,您已经实现的代理服务是您的最佳选择。
  2. 编写一个返回此信息的Java。Silverlight可以选择javascript,而javascript可以选择Java applet。这也适用于相反的情况,但设置起来有点困难。(如果你需要更多关于这方面的信息,请让我知道)。
  3. 使用javascript XmlHttpRequest从源中获取你想要的数据。当支持多个浏览器时,这可能很困难。此链接显示了如何执行此操作的示例(您需要向下滚动)。Javascript get Html

代码:

代码语言:javascript
复制
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);
  }}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4471983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档