安装的Internet Explorer 11预览版后,我遇到Winforms .NET Class“WebBrowser”的问题。当我打电话给我的网页时,看起来像禁用javascipt。
答案 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.");
}
}