5

问题:

我正在运行一个带有嵌入式 WebBrowser 控件的 winforms 应用程序。我已经使用魔法注册表设置将此控件切换到 IE 8 模式(如此处回答的 IE9 WebBrowser 控件是否支持 IE9 的所有功能,包括 SVG?)。

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

我希望我的控件保持在 IE8 模式...

我的解决方案尝试

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

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

帮助

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

有人有什么想法吗?

我正在使用 .Net 4,我无法更改将显示的网站,并且无论 X-UA-Compatible 标签如何,我都需要它以 IE8 模式呈现...

谢谢!

4

2 回答 2

3

我也有问题DocumentText——我放弃了。

我的解决方案是编写一个进程内 HTTP 服务器并指向WebBrowser它。

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

就我而言,我是从文件系统中获取内容的。
您必须更改它才能调用您的目标网站,但这不应该是太多的工作。
然后您可以根据需要修改 HTML,链接仍然有效。

于 2012-06-03T09:48:14.340 回答
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

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

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 控件。测试了一下,好像加载文档的其余部分OK。

于 2012-06-03T09:18:29.327 回答