【问题标题】:Trying to get the user-agent from request in asp.net web api self host试图从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();

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

【问题讨论】:

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


    【解决方案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 中使用。
          • 啊,没意识到。谢谢。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-02
          • 2016-03-12
          • 1970-01-01
          • 2014-12-14
          • 2014-10-21
          • 1970-01-01
          相关资源
          最近更新 更多