试图从asp.net web api self host中的请求中获取用户代理

Posted

技术标签:

【中文标题】试图从asp.net web api self host中的请求中获取用户代理【英文标题】:Trying to get the user-agent from request in asp.net web api self host 【发布时间】:2013-02-24 21:37:38 【问题描述】:

我正在尝试在 web api 自托管中获取用户代理,但我做错了,或者 web api 本身正在更改用户代理字符串。

我尝试使用几种方法来获取字符串,它们都返回相同的结果,而不是例外的“Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (Khtml, like Gecko) Chrome/26.0 .1410.28 Safari/537.31”,我只得到“Mozilla/5.0”。

我试过了:

var header = request.Headers.SingleOrDefault(h => h.Key == "User-Agent").Value.First();

var header = request.Headers.UserAgent.SingleOrDefault().Product.ToString();

var header = request.Headers.GetValues("User-Agent").FirstOrDefault();

我做错了吗,它是自托管的,所以我没有可以使用的上下文。

【问题讨论】:

【参考方案1】:

从 WebAPI 控制器内部获取完整用户代理的绝对最简单的方法是这样做:

var userAgent = Request.Headers.UserAgent.ToString();

它给出的结果与执行手动步骤完全相同,如下所示:

// var headers = request.Headers.GetValues("User-Agent");
// var userAgent = string.Join(" ", headers);

【讨论】:

【参考方案2】:

.NET Core 2.0(+)

就像Request.Headers["User-Agent"] 一样简单(以字符串形式返回);)

【讨论】:

【参考方案3】:

哎呀,想通了,自己回答,以防其他人遇到这个问题。显然用户代理被切碎了。

这给了我完整的用户代理:

// Default empty user agent.
String userAgent = "";

// Get user agent.
if (Request.Headers.Contains("User-Agent"))

    var headers = request.Headers.GetValues("User-Agent");

    StringBuilder sb = new StringBuilder();

    foreach (var header in headers)
    
        sb.Append(header);

        // Re-add spaces stripped when user agent string was split up.
        sb.Append(" ");
    

    userAgent = sb.ToString().Trim();

【讨论】:

这是一个极端的过度复杂化。只需ToString Request.Headers.UserAgent 即可获得相同的结果。 或者只是 Request.UserAgent。 user1154664,Request.UserAgent 不是 System.Net.Http.HttpRequestMessage 的一部分。 另外,严重的是,它甚至是字符串连接的过度复杂化;将来,只需将string.Join 用于此类目的。 (在这种情况下甚至没有必要!)【参考方案4】:
var context = new HttpContextWrapper(HttpContext.Current);
HttpRequestBase request = context.Request;
var browserdetail = request.UserAgent;

如果您只需要浏览器名称,这对我有用,然后只需编写:

var browserdetail = request.browser

如果您想要客户端 IP 地址,那么只需执行以下操作:

var browserdetail = request.hostaddress 并将其用于 生成用于身份验证的令牌密钥。

【讨论】:

【参考方案5】:

答案很简单,试试下面的。它更短,更不容易折断。

String userAgent;
userAgent = Request.UserAgent;

它会给你一个类似于这个的字符串。

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)

文档:http://msdn.microsoft.com/en-us/library/system.web.httprequest.useragent.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

【讨论】:

System.Web.HttpRequest 是对 ASP.NET WebForms/MVC 的请求,在 ASP.NET WebApi 中使用。 啊,没意识到。谢谢。

以上是关于试图从asp.net web api self host中的请求中获取用户代理的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API 和 OpenID Connect:如何从授权码中获取访问令牌

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值

如何使 ASP.NET Web API Web 服务在本地网络中可用

如何在 ASP.NET Core Web API 中使用 LINQ 仅从数据库中获取最新的 id?

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api

ASP.NET Web API 简介