如何在Asp.net Core中获取用户浏览器名称(user-agent)?

172

请问在MVC 6和ASP.NET 5中,如何获取客户端正在使用的浏览器名称?


使用用户代理进行浏览器检测 - Hans Kesting
8个回答

260

我认为这很容易。在Request.Headers["User-Agent"].ToString()中获得了答案。


15
这使我获得了所有浏览器名称的返回结果。 - kobosh
5
@kobosh Request.Headers["User-Agent"].ToString() 请将此代码翻译为中文。 - Andriy Tolstoy
12
如果请求中没有用户代理(User-Agent),将会导致KeyNotFoundException异常!务必先使用.ContainsKey方法检查一下! - user169771
13
算了,出于某种原因它只返回 ""。太好了,至少还是一致的... - user169771
76
有些人可能更喜欢 Request.Headers[HeaderNames.UserAgent],因为它避免了字符串字面量(在Core 1.0中可能无效,不确定)。 - Will Dean
显示剩余6条评论

54

对我来说,Request.Headers["User-Agent"].ToString()没有帮助,因为它返回所有浏览器的名称,所以我找到了以下解决方案。

安装了ua-parse

在控制器中使用using UAParser;

var userAgent = HttpContext.Request.Headers["User-Agent"];
var uaParser = Parser.GetDefault();
ClientInfo c = uaParser.Parse(userAgent);

使用上述代码后,能够通过c.UA.Family + " " + c.UA.Major +"." + c.UA.Minor获取浏览器详情。

您还可以获取操作系统详情,例如:c.OS.Family;

c.UA.Major是浏览器的主要版本,而c.UA.Minor是浏览器的次要版本。


7
这不是所有浏览器名称的列表,而是浏览器设置为用户代理的内容。UAParser 知道如何获取所有这些名称并确定实际的浏览器和操作系统。 - John C
ua-parse.NET 6 中是否有效? - Kiquenet
1
@Kiquenet,我正在使用UAParser,这个库提供的信息对我来说已经足够了,非常好用:D - Konsultan IT Bandung

22

那个链接是最佳答案。User-Agent字符串是一个你必须解密和解析以获取版本信息的字符串。提供的类会完成所有的艰苦工作。 - JustLooking
这个答案适用于.NET Framework,而不是.NET Core。 - Alex from Jitbit
我有一个Web应用程序,大约95%的用户会发送回一个用户代理。然而,其余的没有。这些不是机器人,因为用户正在进行付费预订。有人能解释为什么用户代理会为空吗?大多数用户在移动设备上。是否有一些浏览器不会返回UA? - Norbert Norbertson

11

我开发了一个库,扩展了ASP.NET Core以支持在Wangkanai.Detection上检测Web客户端浏览器信息。这应该让您识别浏览器名称。

namespace Wangkanai.Detection
{
    /// <summary>
    /// Provides the APIs for query client access device.
    /// </summary>
    public class DetectionService : IDetectionService
    {
        public HttpContext Context { get; }
        public IUserAgent UserAgent { get; }

        public DetectionService(IServiceProvider services)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));

            this.Context = services.GetRequiredService<IHttpContextAccessor>().HttpContext;
            this.UserAgent = CreateUserAgent(this.Context);
        }

        private IUserAgent CreateUserAgent(HttpContext context)
        {
            if (context == null) throw new ArgumentNullException(nameof(Context)); 

            return new UserAgent(Context.Request.Headers["User-Agent"].FirstOrDefault());
        }
    }
}

这是如何工作的?我看到你有一个 DeviceResolver.cs 来查找它是移动设备、平板还是桌面电脑,但我看不到类似的代码来提取用户代理标头的详细信息。 - thoean
我已经更新了代码库,自述文件也变得更加成熟。https://github.com/wangkanai/Detection - Sarin Na Wangkanai
在Nuget中是否有Wangkanai.Detection? - Kiquenet

1

安装这个.nuget包

创建一个像这样的类:

public static class YauaaSingleton
    {
        private static UserAgentAnalyzer.UserAgentAnalyzerBuilder Builder { get; }

        private static UserAgentAnalyzer analyzer = null;

        public static UserAgentAnalyzer Analyzer
        {
            get
            {
                if (analyzer == null)
                {
                    analyzer = Builder.Build();
                }
                return analyzer;
            }
        }

        static YauaaSingleton()
        {
            Builder = UserAgentAnalyzer.NewBuilder();
            Builder.DropTests();
            Builder.DelayInitialization();
            Builder.WithCache(100);
            Builder.HideMatcherLoadStats();
            Builder.WithAllFields();
        }


    }

在您的控制器中,您可以从HTTP标头读取用户代理:

string userAgent = Request.Headers?.FirstOrDefault(s => s.Key.ToLower() == "user-agent").Value;

然后您可以解析用户代理:
 var ua = YauaaSingleton.Analyzer.Parse(userAgent );

 var browserName = ua.Get(UserAgent.AGENT_NAME).GetValue();

你还可以获得置信度水平(数值越高越好):
 var confidence = ua.Get(UserAgent.AGENT_NAME).GetConfidence();

你在 .NET 6 中进行测试吗? - Kiquenet
抱歉我有一段时间没有在那个项目上工作了,希望能尽快恢复。如果您发现问题,请在 GitHub 上报告。 - Stefano Balzarotti

1

如果您正在使用 .net 6 或更高版本,似乎有一个属性可供使用。因此,如果您在控制器中,可以像这样访问它:

var userAgent = HttpContext.Request.Headers.UserAgent;

或者,如果您不在控制器中,可以注入 IHttpContextAccessor 的实现,并像这样访问它:

using Microsoft.AspNetCore.Http;

public class MyClass
{
    public MyClass(IHttpContextAccessor httpContextAccessor)
    {
          _httpContextAccessor = httpContextAccessor;   
    }

    public string? GetUserAgent()
    {
        return _httpContextAccessor?.HttpContext?.Request.Headers.UserAgent;
    }
}

请注意,在您的 program.cs 或 startup.cs 中添加以下代码行以注册 IHttpContextAccessor:

services.AddHttpContextAccessor();

services.AddHttpContextAccessor();

0
var userAgent = $"{this.Request?.HttpContext?.Request?.Headers["user-agent"]}";

0
在生产应用中,首先检查用户代理是否存在非常重要。
public static string GetUserAgent(this HttpContext context)
{
    if (context.Request.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgent))
    {
        return userAgent.ToString();
    }
    return "Not found";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接