2010-12-17 9 views
0

Ich versuche, Inhalt von http://www.yahoo.com mit WebClient#DownloadStringAsync() zu erhalten. Da Silverlight jedoch keine domänenübergreifenden Aufrufe zulässt, erhalte ich TargetInvocationException. Ich weiß, dass wir clientaccesspolicy.xml und crossdomain.xml in unserem Webserver root ablegen müssen, aber das ist nur möglich, wenn ich die Kontrolle über meine Dienste habe. Derzeit ist Google nicht unter meiner Kontrolle;), also wie gehe ich damit um?WebClient-Problem

Ich habe eine Problemumgehung gemacht, indem ich einen WCF-Dienst in meiner Webanwendung gemacht und dann WebClient aufgerufen habe. Das funktioniert perfekt, aber es ist ziemlich ineffizient. Gibt es einen anderen besseren Weg als diesen?

Vielen Dank im Voraus :)

Antwort

1

Cross-Domain-restricitions Silverlight verursachen viele Entwickler Abhilfen zu implementieren. Wenn Sie die HTML-Seite anzeigen müssen, die Sie zurückbekommen, sollten Sie sich das Silverlight 4 (WebBrowser) -Steuerelement ansehen, obwohl dies nur im Out-of-Browser-Modus zu funktionieren scheint.

Wenn Sie durch den Inhalt analysieren müssen, können Sie einige der folgenden versuchen:

  1. Für einen verwalteten Code Lösung der Proxy-Dienst, den Sie bereits implementiert haben, ist die beste Option.

  2. Schreiben Sie ein Java-Applet, das diese Informationen zurückgibt. Silverlight kann zu Javascript interoptieren, das in Java-Applets interopt. Dies funktioniert auch im Rückwärtsgang, ist aber etwas schwierig einzurichten. (Wenn Sie mehr Informationen dazu benötigen, lassen Sie es mich wissen).

  3. Verwenden Sie Javascript XmlHttpRequest, um die gewünschten Daten aus der Quelle zu erhalten. Dies kann schwierig sein, wenn mehrere Browser unterstützt werden. Dieser Link zeigt ein Beispiel dafür (Sie müssen nach unten scrollen). Javascript get Html

Code:

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