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

时间:2013-03-09 09:43:44

标签: asp.net-web-api self-hosting

我正在尝试在web api self主机中获取用户代理,我做错了,或者web api本身正在改变用户代理字符串。

我尝试使用几种方法来获取字符串并且它们都返回相同的结果,而不是例外的“Mozilla / 5.0(Windows NT 6.2; WOW64)AppleWebKit / 537.31(KHTML,如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();

我做错了,它是自我主持人所以我没有上下文可以使用。

5 个答案:

答案 0 :(得分:71)

从WebAPI控制器中获取完整用户代理的绝对最简单的方法是:

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

它提供完全相同的结果,就像执行手动步骤一样:

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

答案 1 :(得分:4)

.NET Core 2.0(+)

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

答案 2 :(得分:0)

哎呀,弄清楚了,自己回答,万一其他人遇到这个问题。显然,用户代理被砍掉了。

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

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

答案 3 :(得分:0)

var context = new HttpContextWrapper(HttpContext.Current);
HttpRequestBase request = context.Request;
var browserdetail = request.UserAgent;

如果您只想要浏览器名称,那么这对我有用,只需写下:

var browserdetail = request.browser

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

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

答案 4 :(得分:-1)

答案很简单,请尝试以下方法。它更短,不太可能破裂。

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