ChatGPT解决这个技术问题 Extra ChatGPT

How to get user Browser name ( user-agent ) in Asp.net Core?

Can you please let me know how to get the browser's name that the client is using in MVC 6, ASP.NET 5?


M
Mehdi Dehghani

I think this was an easy one. Got the answer in Request.Headers["User-Agent"].ToString()


this returned all browsers names to me
@kobosh Request.Headers["User-Agent"].ToString()
Beware this will result if a KeyNotFoundException if the request has no User-Agent! Be sure to use .ContainsKey first to check!
Scratch that. it just returns "" instead for some reason. Hooray for consistency...
Some may prefer Request.Headers[HeaderNames.UserAgent] as avoiding the string literal (may not have worked in Core 1.0, not sure)
J
JGH

For me Request.Headers["User-Agent"].ToString() did't help cause returning all browsers names so found following solution.

Installed ua-parse.

In controller using UAParser;

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

after using above code was able to get browser details from userAgent by using c.UA.Family + " " + c.UA.Major +"." + c.UA.Minor You can also get OS details like c.OS.Family;

Where c.UA.Major is a browser major version and c.UA.Minor is a browser minor version.


That is not a list of all browser names, that is what the browser is setting as the User-Agent. The UAParser knows how to take all those names and determine what the actual browser and OS it.
ua-parse valid for NET 6 ?
@Kiquenet, I'm using UAParser, information from this library was enough for me, works like a charm :D
U
Uzay
userAgent = Request.Headers["User-Agent"]; 

https://code.msdn.microsoft.com/How-to-get-OS-and-browser-c007dbf7 (link not live) go for 4.8

https://docs.microsoft.com/en-us/dotnet/api/system.web.httprequest.useragent?view=netframework-4.8


That link is the best answer. The User-Agent string is a string that you have to decipher and parse to get version information. The classes supplied there do all the hard-work.
This answer is for .NET Framework, not .NET Core
I have a web app and about 95% of users send back a user agent. However, the rest do not. These are not bots because the users are making paid bookings. Can anyone explain why user agent would be null? Most users are on mobile devices. Are there some browsers not returning ua?
S
Sarin Na Wangkanai

I have developed a library to extend ASP.NET Core to support web client browser information detection at Wangkanai.Detection This should let you identity the browser name.

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());
        }
    }
}

How does this work? I see you have a DeviceResolver.cs to find out whether it's a mobile, table or desktop, but I can't see similar code to extract details of the user agent header.
I have updated the repo and the readme is getting more mature. github.com/wangkanai/Detection
Wangkanai.Detection in Nuget ?
S
Stefano Balzarotti

Install this .nuget package

create a class like this:

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();
        }


    }

in your controller you can read the user agent from http headers:

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

Then you can parse the user agent:

 var ua = YauaaSingleton.Analyzer.Parse(userAgent );

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

you can also get the confidence level (higher is better):

 var confidence = ua.Get(UserAgent.AGENT_NAME).GetConfidence();

do you test in NET 6?
D
Deivydas Voroneckis

In production application it is important to check first if user agent exists.

public static string GetUserAgent(this HttpContext context)
{
    if (context.Request.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgent))
    {
        return userAgent.ToString();
    }
    return "Not found";
}