Comment effectuer une requête interdomaine dans un contrôle Webbrowser?
-
03-07-2019 - |
Question
Comme vous le savez, les requêtes XMLHTTP entre domaines ne sont pas autorisées pour des raisons de sécurité sous Internet Explorer.
J'ai un contrôle WebBrowser et j'utilise DocumentText
au lieu de Naviguer
vers une URL. Étant donné que le domaine actuel est sur: blanc
lorsque la page tente de se faire une demande à lui-même ou à un autre domaine, je reçois L'accès est refusé
Erreur Javascript.
Même lorsque j'utilise Naviguer
si le code JavaScript ne demande pas à un autre domaine, il ne fonctionne pas.
Comment puis-je contourner cela?
Ce code HTML doit fonctionner avec le contrôle WebBrowser:
<body>
<a href="javascript:getit('http://www.google.com')">this should work</a>
<div id="x"></div>
</body>
<script>
function XHConn()
{
var xmlhttp, bComplete = false;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false; }}}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone)
{
if (!xmlhttp) return false;
bComplete = false;
sMethod = sMethod.toUpperCase();
try {
if (sMethod == "GET")
{
xmlhttp.open(sMethod, sURL+"?"+sVars, true);
sVars = "";
}
else
{
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete)
{
bComplete = true;
fnDone(xmlhttp);
}};
xmlhttp.send(sVars);
}
catch(z) { return false; }
return true;
};
return this;
}
function getit(url){
var xmlhttp = new XHConn();
var fnWhenDone = function (oXML) { document.getElementById('x').innerHTML = oXML.responseText; alert(oXML.responseText); };
xmlhttp.connect(url, "GET", "", fnWhenDone);
}
</script>
- Je n'ai pas de contrôle sur le code Javascript / HTML, mon application héberge uniquement un contrôle Webbrowser
- J'ai trouvé un élément appelé de l'action URL CROSS_DOMAIN_DATA. Drapeaux , pas sûr que ce soit la bonne direction. Même si je ne suis pas sûr de savoir comment le mettre en œuvre.
- Si vous pouvez également répondre à cette question: Comment définir document.domain actuel dans le contrôle WebBrowser pour éviter" Accès refusé "? Cela me suffit également.
La solution
J'ai trouvé une solution de contournement, chargez un code HTML local (c: \ temp \ temp.html) puis modifiez-en le contenu via javascript.
Après ce moment, il n'y aura plus de restriction CrossDomain, cependant, utiliser document.write, ce qui causera d'autres problèmes désagréables, tels que les fonctions JQuery .ready
, ne fonctionnera pas.
Autres conseils
Cochez cette case, cela a fonctionné pour moi comme un charme. http://support.microsoft.com/default.aspx? scid = kb; en-us; 246227
Je ne comprends pas sur quel domaine vous n'avez pas accès au Javascript ... Avez-vous essayé d'utiliser la balise script pour obtenir les données souhaitées d'un autre domaine? Vous pouvez utiliser l'orthographe JSONP pour créer un espace de noms des données ...
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "anotherdomain.com/data?callback=myFunction";
head.appendChild(script);
Et ensuite sur "/ data":
myFunction({
// data here
});
URLACTION-CROSS-DOMAIN-DATA semble être la bonne direction: Lisez ceci pour savoir pourquoi
La seule façon de le faire est de vous assurer que votre code est exécuté dans la zone de confiance (ou plus semblable à HTA). Par défaut, tout ce qui est exécuté dans le contrôle WebBrowser s'exécute dans la zone d'où proviennent les fichiers servis. (c’est-à-dire que les stratégies de sécurité IE standard sont utilisées).
Pour modifier ce comportement, vous devez modifier l'application qui héberge le contrôle WebBrowser et implémenter quelques interfaces sur ce contrôle WebBrowser. (IInternetHostSecurityManager, IInternetZoneManager et IInternetSecurityMgrSite sont ceux que vous devriez jeter un coup d'œil.) Ce n'est pas une tâche triviale et la documentation à ce sujet est au mieux rare.
Une fois que cela est fait, votre code peut être exécuté avec tous les privilèges dont vous avez besoin et les requêtes entre domaines sont aussi simples que de réinitialiser les meilleurs scores de Mime-Sweeper.
J'espère que cela vous aidera.