在渲染之前从WebBrowser控件中删除标记

时间:2012-05-31 17:17:10

标签: c# .net webbrowser-control

问题:

我正在运行带有嵌入式WebBrowser控件的winforms应用程序。我已经使用魔术注册表设置将此Control切换到IE 8模式(这里回答Will the IE9 WebBrowser Control Support all of IE9's features, including SVG?)。

但是现在如果我导航到包含Meta标签的网站X-UA-Compatible IE = 9(从http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx开始),我的webbrowser控件将切换到IE9模式并忽略注册表设置。

我希望我的控制能够保持在IE8模式......

我的解决方案尝试

我尝试在使用IHTMLDOMNode.removeChild加载控件(Document_complete)后删除元标记,但控件不会重新呈现页面。

我尝试手动加载HTML内容(使用WebClient),删除元标记并将其提供到webbrowser控件(使用Document.Write或DocumentText),但这样控件拒绝加载任何其他内容(像图像)。

帮助

现在我没有想法编写我自己的HTTPProxy并修改路上的响应(我不想这样做)。

任何想法?

我正在使用.Net 4,我无法更改将要显示的网站,无论X-UA兼容标签如何,我都需要在IE8模式下进行渲染...

谢谢!

2 个答案:

答案 0 :(得分:3)

我也遇到了DocumentText的问题 - 我放弃了它。

我的解决方案是编写进程内HTTP服务器并将WebBrowser指向该位置。

我在这里写了一篇关于它的文章:http://SimplyGenius.net/Article/WebBrowserEx

在我的情况下,我从文件系统获取内容。
您必须更改它以拨打您的目标网站,但它不应该太多工作​​。
然后,您可以根据需要修改HTML,链接仍然有效。

答案 1 :(得分:2)

不知道如何使WebBrowser控件忽略该标记而不覆盖您的注册表设置。对于快速(脏)的解决方法,您可以执行以下操作。

为要在WebBrowser控件中显示的站点创建请求。

var requestUri = new Uri("http://stackoverflow.com/");
var request = (HttpWebRequest) WebRequest.Create(requestUri);

得到答复。

var response = request.GetResponse();
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var html = reader.ReadToEnd();
    //...
}

使用NuGet安装HTMLAgilityPack。

http://nuget.org/packages/HtmlAgilityPack

将刚刚检索到的HTML加载到HtmlDocument实例中。

var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

选择标记。在这里,我使用StackOverflow.com作为示例,并选择其样式表节点。找到后,只需删除节点。

var nodes = document.DocumentNode.SelectNodes("//link[@rel=\"stylesheet\"]");
foreach(var node in nodes)
{
    node.ParentNode.RemoveChild(node);
}

剩下的就是检索修改后的HTML并将其直接提供给WebBrowser控件。

html = document.DocumentNode.OuterHtml;
webBrowser.DocumentText = html;

它无法解释那里没有的东西。

您也可以这样做来解决您的问题。发出请求,获取响应,修改HTML并将其提供给WebBrowser控件。测试它,似乎加载文件的其余部分确定。