[英]Internet explorer 11 detection on server side
我們都知道IE11檢測不適用於服務器端語言,因為微軟已經刪除了IE / MSIE瀏覽器指示,現在完全是“Mozilla”。
我也知道做瀏覽器檢測/版本存在風險,但過去一直很好。
網站的一些要求是這樣的:
必須使用某些版本的firefox以上必須使用某些版本的chrome及以上必須使用某些版本的safari(一些下面和一些較新的)必須使用IE> = 8
所以這就是問題... IE11在我的列表中指出它不受支持。 我想從服務器上的東西的Web端支持它(ASP.NET / MVC)
目前尚不清楚如何從服務器端檢測到這一點。 有誰知道怎么樣?
這是IE 11中顯示的用戶代理:
“像Gecko一樣的Mozilla / 5.0(Windows NT 6.1; WOW64; Trident / 7.0; rv:11.0)”
rv:11.0告訴我們它的IE11,然而對它進行解析仍然意味着,例如,它可能是某個版本的chrome,在這樣的要求中甚至不支持firefox。
那么,在這里看看IE 11或更高版本的最佳方式是什么?
我不太確定從“Trident”開始搜索,因為我不知道其他瀏覽器是否使用它。
歡迎任何方向。
使用正則表達式,如:
Regex.IsMatch(this.Request.UserAgent, @"Trident/7.*rv:11")
Trident是IE使用的渲染引擎的名稱。 其他一些應用程序也使用Trident引擎,您可以在Wikipedia文章中看到。 但是在用戶代理中搜索Trident應該不是問題,因為沒有其他主流瀏覽器使用Trident。
只有IE11使用Trident版本7,所以如果你用正則表達式搜索Trident/7
,它應該找到IE11。
為了保持與現有代碼的兼容性,我創建了一個自定義提供程序,因此Request.Browser
將按預期返回信息。 例如, Browser.Browser
將是“IE”而不是“InternetExplorer”,這是安裝此修補程序后的新值。
此外,此方法在兼容性視圖中返回IE的實際版本,而不是版本7。 請注意, Browser.Type
在兼容性視圖中將返回“IE7”,以防您需要檢測它,或者您可以輕松修改自定義提供程序以更改.Type。
方法很簡單。 從HttpCapabilitiesDefaultProvider
派生一個類,並將BrowserCapabilitiesProvider
設置為您的類的實例。
在Global.asax.cs中:
protected void Application_Start(Object sender, EventArgs e)
{
...
HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
...
}
定義您的課程: 更新為包括MICROSOFT EDGE BROWSER
public class CustomerHttpCapabilitiesProvider : HttpCapabilitiesDefaultProvider
{
public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request)
{
HttpBrowserCapabilities browser = base.GetBrowserCapabilities(request);
// Correct for IE 11, which presents itself as Mozilla version 0.0
string ua = request.UserAgent;
// Ensure IE by checking for Trident
// Reports the real IE version, not the compatibility view version.
if (!string.IsNullOrEmpty(ua))
{
if (ua.Contains(@"Trident"))
{
if (!browser.IsBrowser(@"IE"))
{
browser.AddBrowser(@"ie");
browser.AddBrowser(@"ie6plus");
browser.AddBrowser(@"ie10plus");
}
IDictionary caps = browser.Capabilities;
caps[@"Browser"] = @"IE";
// Determine browser version
bool ok = false;
string majorVersion = null; // convertable to int
string minorVersion = null; // convertable to double
Match m = Regex.Match(ua, @"rv:(\d+)\.(\d+)");
if (m.Success)
{
ok = true;
majorVersion = m.Groups[1].Value;
minorVersion = m.Groups[2].Value; // typically 0
}
else
{
m = Regex.Match(ua, @"Trident/(\d+)\.(\d+)");
if (m.Success)
{
int v;
ok = int.TryParse(m.Groups[1].Value, out v);
if (ok)
{
v += 4; // Trident/7 = IE 11, Trident/6 = IE 10, Trident/5 = IE 9, and Trident/4 = IE 8
majorVersion = v.ToString(@"d");
minorVersion = m.Groups[2].Value; // typically 0
}
}
}
if (ok)
{
caps[@"MajorVersion"] = majorVersion;
caps[@"MinorVersion"] = minorVersion;
caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
}
}
else if (ua.Contains(@"Edge"))
{
if (!browser.IsBrowser(@"Edge"))
{
browser.AddBrowser(@"edge");
}
IDictionary caps = browser.Capabilities;
caps[@"Browser"] = @"Edge";
// Determine browser version
Match m = Regex.Match(ua, @"Edge/(\d+)\.(\d+)");
if (m.Success)
{
string majorVersion = m.Groups[1].Value;
string minorVersion = m.Groups[2].Value;
caps[@"MajorVersion"] = majorVersion;
caps[@"MinorVersion"] = minorVersion;
caps[@"Version"] = String.Format(@"{0}.{1}", majorVersion, minorVersion);
}
}
}
return browser;
}
}
我在使用淘汰系統后使用下面的Regex來檢查這一點,以檢查用於訪問該站點的瀏覽器。
在這種情況下,即使檢查瀏覽器“IE”並返回false,我繼續使用此正則表達式並檢查它是否與用戶代理匹配:
(?:\\b(MS)?IE\\s+|\\bTrident\\/7\\.0;.*\\s+rv:)(\\d+)
我希望這可以幫助別人。 我測試了它並且工作正常。 我還將rv改為12及以上,如果在IE12中它們將rv改為12,它也可以正常工作。
public ActionResult Index()
{
var browser = this.Request.Browser;
System.Diagnostics.Trace.WriteLine(browser.Browser); // InternetExplorer
System.Diagnostics.Trace.WriteLine(browser.MajorVersion); // 11
return View();
}
請注意,您需要安裝了http://support.microsoft.com/kb/2836939/en-us的 .NET 4.5或.NET 4.0才能正確檢測IE11。
聽起來好像是白名單瀏覽器,這不是一個好主意。 通常,您確實需要對功能進行客戶端檢測。 MVC真的不知道它是什么瀏覽器,Request.Browser對象可以給你一些想法,但這不是真的可靠,這是IE 11的情況。它告訴我我的開發機器上的版本11,但我的7服務器,這可能是一個災難性的錯誤。
我構建了單頁應用程序,並采用了與Google類似的態度,僅支持當前和以前版本的瀏覽器。 當我發現一個過時的瀏覽器時,我服務的是一個“核心”網站,它只是一些基本的CSS和標記,沒有JavaScript。 這種方式更簡單,使開發變得更加容易。
無論如何,我檢測的方式是測試當前版本的IE,如下所示:
public static bool IsModernIE() {
return HttpContext.Current.Request.Browser.Browser == "InternetExplorer";
}
它是一個HTML幫助方法。 所以在你的cshtml中你可以使用測試。 在我的控制器中,我調用了各個版本的測試。 這最終是一種非常脆弱的方式。 我基本上在現代IE(10/11)和舊IE(9-)之間畫了一條線。 這個測試可能與下一個版本無關,我還沒有測試過Xbox One。
我有一個我使用的庫,發布在GitHub上。 我現在稱它為可用的Alpha,所以如果你願意的話就把它當作它來運行吧。 我想讓測試更加外部可配置,等等。這里是存儲庫的URL, https://github.com/docluv/SPAHelper 。 我實際上在我的博客http://love2dev.com上使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.