在安裝Internet Explorer 11 Preview的後,Winforms .NET類「WebBrowser」出現問題。當我打電話給我的網頁時,它看起來像禁用javascipt。WebBrowser控件 - 安裝後的頁面呈現錯誤IE 11
0
A
回答
0
如果您的WebBrowser
爲基礎的應用程序和您的網頁仍然可以正常使用IE10,以下可能是問題的原因。
在一個頗具爭議的決定中,Microsoft has changed the traditional layout of IE User Agent (UA) string in IE11。
這是UI字符串的樣子在IE11:
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字符串的方法之一是強制IE7仿真與FEATURE_BROWSER_EMULATION
您WebBrowser
基於應用程序。不幸的是,你不得不像IE7一樣低。指定更高版本不會恢復舊的UA字符串佈局。
另一個更靈活但更復雜的解決方法是通過WinAPI設置一個自定義的UA字符串通過UrlMkSetSessionOption
/URLMON_OPTION_USERAGENT
WinAPI。您應該使用UrlMkGetSessionOption
檢索當前UI字符串,解析它,添加缺少的部分並將其設置回UrlMkSetSessionOption
。在WebBrowser
對象被實例化之前,在Form
類的static
構造函數中執行此操作。
[UPDATE]用於改變用戶代理字符串的代碼:
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.");
}
}
相關問題
- 1. WebBrowser控件呈現的頁面從IE
- 2. iOS 11 presentViewController後面呈現控制器
- 3. WebBrowser控件不呈現一些網頁
- 4. WebBrowser控件頁面加載錯誤
- 5. 錯誤頁面不呈現
- 6. Joomla - 頁面呈現控件
- 7. 在Webbrowser控件中更改呈現頁面
- 8. 調用webbrowser控制asp.net頁面錯誤後面的代碼?
- 9. 頁面呈現期間出現異常時的錯誤頁面
- 10. Grails 2.2.0呈現錯誤頁面
- 11. 從插件控制器呈現頁面
- 12. 從子頁面呈現控件佈局
- 13. IE邊緣停止呈現頁面
- 14. IE瀏覽器安裝後雙擊WebBrowser控件不會自動選擇文本
- 15. jQuery POST後呈現頁面
- 16. DateTimePicker控件安裝錯誤
- 17. 將WebBrowser控件功能模擬中的VBScript設置爲IE 11
- 18. 訪問頁面時出現IE錯誤?
- 19. 彈簧控制器異常/錯誤頁面呈現
- 20. 在webbrowser控件中加載頁面後捕獲錯誤在C#中.net
- 21. WebBrowser控件和JavaScript錯誤
- 22. 的Visual Studio 11安裝錯誤
- 23. 頁面呈現後的日誌時間
- 24. 安裝後出現錯誤Open Fire XMPP
- 25. 等到WebBrowser控件的頁面加載
- 26. 有沒有辦法在wpf WebBrowser控件上呈現WPF控件?
- 27. SignalR:安裝後出現錯誤SignalR
- 28. 安裝Visual Studio 2017後出現錯誤
- 29. npm安裝後出現Webpack錯誤
- 30. asp.Net發佈後無法呈現頁面
謝謝,但修復程序不工作。如何在.NET中輕鬆設置UrlMkSetSessionOption? – majco333
@ majco333,不確定你的意思是「hotfix」。我已經發布了相關代碼,將'GetIEVersion'和'Win32' p/invoke定義保留爲練習。 – Noseratio
我必須導入到Win32函數的.net項目中。因爲我沒有看到我的項目。謝謝 – majco333