请问在MVC 6和ASP.NET 5中,如何获取客户端正在使用的浏览器名称?
请问在MVC 6和ASP.NET 5中,如何获取客户端正在使用的浏览器名称?
我认为这很容易。在Request.Headers["User-Agent"].ToString()
中获得了答案。
Request.Headers["User-Agent"].ToString()
请将此代码翻译为中文。 - Andriy TolstoyRequest.Headers[HeaderNames.UserAgent]
,因为它避免了字符串字面量(在Core 1.0中可能无效,不确定)。 - Will Dean对我来说,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
是浏览器的次要版本。
ua-parse
在 .NET 6 中是否有效? - KiquenetuserAgent = Request.Headers["User-Agent"];
https://code.msdn.microsoft.com/How-to-get-OS-and-browser-c007dbf7 (链接未激活) 请使用4.8版本。
https://learn.microsoft.com/en-us/dotnet/api/system.web.httprequest.useragent?view=netframework-4.8
我开发了一个库,扩展了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安装这个.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 或更高版本,似乎有一个属性可供使用。因此,如果您在控制器中,可以像这样访问它:
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;
}
}
services.AddHttpContextAccessor();
services.AddHttpContextAccessor();
var userAgent = $"{this.Request?.HttpContext?.Request?.Headers["user-agent"]}";
public static string GetUserAgent(this HttpContext context)
{
if (context.Request.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgent))
{
return userAgent.ToString();
}
return "Not found";
}