0

安装Internet Explorer 11 Preview后,我遇到了 Winforms .NET 类“WebBrowser”的问题。当我调用我的网页时,它看起来像禁用 javascipt。

4

1 回答 1

0

如果WebBrowser基于 IE10 的应用程序和网页仍然可以正常工作,则可能是以下问题的原因。

在一个颇具争议的决定中,微软改变了 IE11 中 IE 用户代理 (UA) 字符串的传统布局

这是 IE11 中 UI 字符串的样子:

navigator.userAgent: Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) 像 Gecko
 文档.文档模式:11
 document.compatMode: CSS1Compat

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

navigator.userAgent:Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0;)
 文档.文档模式:10
 document.compatMode: CSS1Compat

虽然设计良好的网页不应该依赖 UA 字符串来检测可用的 HTML 功能,但许多现有页面仍然如此,这样的更改可能会让他们感到困惑。

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

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

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

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.");
    }
}
于 2013-10-25T23:43:09.887 回答