WebBrowser IFrame访问导致未经授权的访问?

时间:2013-11-16 01:27:13

标签: c# winforms

当我尝试访问此内容时:

var anchors = webBrowser1.Document.Window.Frames[0].Document.GetElementsByTagName("a");

我收到了未经授权的访问异常。到底是怎么回事!?我可以在对象浏览器中浏览整个文档,同时抛出异常,我也可以在webBrowser1中手动点击这个iframe,但是当我尝试在我的应用程序内部访问它时,我收到错误?这是什么巫术?

1 个答案:

答案 0 :(得分:2)

这是因为浏览器不允许您访问来自其他域的iframe,这也适用于域名相同的https网站,幸运的是有一种解决方法。

一旦页面完全加载,您就可以使用JS获取IFrame的内容。

首先加载嵌入了iframe的网页的网址:

webBrowser1.Navigate("https://www.example.com/pagecontaingiframe.html");
webBrowser1.DocumentCompleted += WebBrowserDocumentCompleted;

然后在文档已完成事件中,检查iframe网址是否已加载,而不是我们导航到的原始网址,加载后,使用javascript中的eval函数运行我们自己的代码来拉取iframe的内容。

void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // Optionally check that the url is the original document
    // search for an iframe and its url here first.
    // Then store the name and url for the next step


    // And the magic begins
    if (e.Url.AbsolutePath != new Uri("https://www.example.com/iframeyouneedurl.html").AbsolutePath)
        return;

    webBrowser1.DocumentCompleted -= WebBrowserDocumentCompleted;

    string jCode = "var iframe = document.getElementsByName('iframe_element')[0]; var innerDoc = iframe.contentDocument || iframe.contentWindow.document; innerDoc.documentElement.innerHTML";
    string html = webBrowser1.Document.InvokeScript("eval", new object[] { jCode });
}