C# ASP.NET浏览器类型检测异常:Microsoft Edge被识别为Google Chrome的原因排查
你遇到的这个问题其实很常见,核心原因在于Chromium内核的Edge浏览器会在User-Agent(UA)字符串中包含Chrome相关标识,而你使用的System.Web.HttpBrowserCapabilities是基于ASP.NET传统的浏览器定义文件(.browser)来识别浏览器的,这些文件如果没有及时更新,就会把带Chrome标识的Edge误判成Chrome。
具体原因拆解:
Chromium版Edge为了兼容大多数网站(很多网站只针对Chrome做适配),它的UA字符串会长成这样(以你测试的94版本为例):
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50
注意这里面同时包含了Chrome/94.0.4606.81和Edg/94.0.992.50两个标识。而旧版的ASP.NET浏览器定义文件里,并没有针对Edg/这个标识的识别规则,只会匹配到更先出现的Chrome相关规则,所以就会把Edge识别成Chrome94。
修复方案:
1. 更新浏览器定义文件
ASP.NET的浏览器识别依赖App_Browsers文件夹下的.browser配置文件,你可以通过以下方式更新:
- 安装NuGet包
Microsoft.AspNet.WebApi.Client(它包含了较新的浏览器定义) - 手动在
App_Browsers文件夹中添加Edge的识别规则,比如创建一个edge.browser文件,内容如下:
<browsers> <browser id="Edge" parentID="Chrome"> <identification> <userAgent match="Edg/(?'version'\d+(\.\d+)*)" /> </identification> <capabilities> <capability name="browser" value="Edge" /> <capability name="version" value="${version}" /> </capabilities> </browser> </browsers>
这样ASP.NET就能识别出Edge的UA标识了。
2. 直接解析User-Agent字符串(更可靠)
传统的HttpBrowserCapabilities更新不及时,对于新浏览器的支持总是滞后,所以更稳妥的方式是直接从Request.UserAgent中提取浏览器信息。比如写一个简单的检测方法:
public string GetCurrentBrowserInfo() { string userAgent = Request.UserAgent; if (string.IsNullOrEmpty(userAgent)) return "Unknown Browser"; // 检测Edge(桌面端) if (userAgent.Contains("Edg/")) { int versionStartIndex = userAgent.IndexOf("Edg/") + 4; int versionEndIndex = userAgent.IndexOf(' ', versionStartIndex); if (versionEndIndex == -1) versionEndIndex = userAgent.Length; string version = userAgent.Substring(versionStartIndex, versionEndIndex - versionStartIndex); return $"Edge {version}"; } // 检测Chrome(排除Edge的情况) else if (userAgent.Contains("Chrome/") && !userAgent.Contains("Edg/")) { int versionStartIndex = userAgent.IndexOf("Chrome/") + 7; int versionEndIndex = userAgent.IndexOf(' ', versionStartIndex); if (versionEndIndex == -1) versionEndIndex = userAgent.Length; string version = userAgent.Substring(versionStartIndex, versionEndIndex - versionStartIndex); return $"Chrome {version}"; } // 其他浏览器的检测逻辑(IE、Firefox等) else if (userAgent.Contains("Firefox/")) { // 类似的提取逻辑... return "Firefox"; } else if (userAgent.Contains("MSIE") || userAgent.Contains("Trident/")) { return "IE"; } // fallback到传统检测 return Request.Browser.Browser + " " + Request.Browser.Version; }
这种方式直接读取UA里的专属标识,不会受定义文件滞后的影响,准确性更高。
内容的提问来源于stack exchange,提问作者Edward Sheriff Curtis




