WebBrowser控件 - 安装IE 11后的页面呈现错误

时间:2013-10-25 22:05:10

标签: winforms internet-explorer web webbrowser-control internet-explorer-11

安装的Internet Explorer 11预览版后,我遇到Winforms .NET Class“WebBrowser”的问题。当我打电话给我的网页时,看起来像禁用javascipt。

1 个答案:

答案 0 :(得分:0)

如果基于WebBrowser的应用和您的网页在IE10中仍能正常运行,则可能是以下问题。

在一项颇具争议的决定中,Microsoft has changed the traditional layout of IE User Agent (UA) string in IE11

这是IE11中的UI字符串:

 navigator.userAgent: Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko
 document.documentMode: 11
 document.compatMode: CSS1Compat

这是它在IE10和旧版本中的样子:

 navigator.userAgent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0;)
 document.documentMode: 10
 document.compatMode: CSS1Compat

虽然设计良好的网页不应该依赖UA字符串来检测可用的HTML功能,但是现有的许多页面仍然存在,而这种变化可能会使它们混淆。

如果您无法控制加载的网页,并且无法修复它们,恢复传统UA字符串的一种方法是强制使用基于WebBrowser的应用FEATURE_BROWSER_EMULATION进行IE7模拟。不幸的是,你必须低至IE7。指定更高版本不会恢复旧的UA字符串布局。

另一种更灵活但更复杂的解决方法是通过UrlMkSetSessionOption / URLMON_OPTION_USERAGENT WinAPI设置自定义UA字符串。您应该使用UrlMkGetSessionOption检索当前UI字符串,解析它,添加缺少的部分并使用UrlMkSetSessionOption将其重新设置。在实例化static对象之前,在Form类的WebBrowser构造函数中执行此操作。

[更新] 更改用户代理字符串的代码:

static public void ChangeUserAgentForIE11()
{
    if (GetIEVersion() <= 10)
        return;

    var userAgent = new StringBuilder(256);
    int length = 0;
    Win32.UrlMkGetSessionOption(Win32.URLMON_OPTION_USERAGENT, userAgent, userAgent.Capacity-1, ref length, 0);

    // IE10: navigator.userAgent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)
    // IE11: navigator.userAgent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko

    var regex = new Regex(@"^\s*(Mozilla/\d+\.\d+\s+\()(Windows\s+.*)like Gecko\s*$", RegexOptions.IgnoreCase); //IE11 regex
    var match = regex.Match(userAgent.ToString());
    if (match.Success)
    {
        var newUserAgent = String.Concat(match.Groups[1], "compatible; MSIE 10.0; ", match.Groups[2]);
        Win32.UrlMkSetSessionOption(Win32.URLMON_OPTION_USERAGENT, newUserAgent, newUserAgent.Length, 0);
        var verifyUserAgent = new StringBuilder(256);
        length = 0;
        Win32.UrlMkGetSessionOption(Win32.URLMON_OPTION_USERAGENT, verifyUserAgent, verifyUserAgent.Capacity-1, ref length, 0);
        if (verifyUserAgent.ToString() != newUserAgent)
            throw new ApplicationException("Unable to change WebBrowser User Agent.");
    }
}