我正在尝试使用http://www.yahoo.com
获取WebClient#DownloadStringAsync()
的内容。但是,由于Silverlight不允许跨域调用,因此我收到了TargetInvocationException。我知道我们必须在我们的Web服务器根目录中放置clientaccesspolicy.xml和crossdomain.xml,但只有在我控制了我的服务时才有可能。目前Google不在我的控制范围内;),我该如何处理?
我已经通过在我的Web应用程序中创建WCF服务然后调用WebClient来解决了这个问题。这完美无缺,但却相当无效。还有比这更好的方法吗?
提前致谢:)
答案 0 :(得分:1)
Silverlight的跨域限制导致许多开发人员实施变通方法。如果你需要显示你回来的html页面,你应该看看Silverlight 4(WebBrowser)控件,虽然这只在浏览器模式外运行时才有效。
如果您需要解析内容,可以尝试以下某些操作:
对于托管代码解决方案,您已实施的代理服务是您的最佳选择。
编写一个返回此信息的Java小程序。 Silverlight可以互操作到可以插入Java applet的javascript。这也可以反过来但有点难以设置。 (如果您需要更多信息,请告诉我。)
使用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);
}}