To maintain compatibility with existing code, I created a custom provider so Request.Browser
will return the information as expected. For example, Browser.Browser
will be "IE" not "InternetExplorer", which is the new value after the hotfix is installed.
Additionally, this approach returns the actual version of IE, not version 7 when in compatibility view. Note that Browser.Type
will return "IE7" when in compatibility view in case you need to detect it, or you could easily modify the custom provider to change .Type as well.
The approach is simple. Derive a class from HttpCapabilitiesDefaultProvider
and set BrowserCapabilitiesProvider
to an instance of your class.
In Global.asax.cs:
protected void Application_Start(Object sender, EventArgs e)
{
...
HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
...
}
Define your class: UPDATED TO INCLUDE 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;
}
}