You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# ASP.NET浏览器类型检测异常:Microsoft Edge被识别为Google Chrome的原因排查

Edge浏览器被误识别为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.81Edg/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

火山引擎 最新活动