如何提取网页API的消息处理程序自定义头值?(How to extract custom heade

2019-07-20 04:32发布

我目前在我的Web API服务的消息处理程序覆盖“SendAsync”,如下所示:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
  //implementation
}

在此代码,我需要检查命名的自定义添加请求头值MyCustomID 。 问题是,当我做到以下几点:

if (request.Headers.Contains("MyCustomID"))  //OK
    var id = request.Headers["MyCustomID"];  //build error - not OK

...我收到以下错误信息:

不能与[]适用索引,以类型的表达式“System.Net.Http.Headers.HttpRequestHeaders”

如何我可以通过访问一个自定义的请求头HttpRequestMessage ( MSDN文档 )实例传入此重写的方法?

Answer 1:

尝试是这样的:

IEnumerable<string> headerValues = request.Headers.GetValues("MyCustomID");
var id = headerValues.FirstOrDefault();

还有你可以使用,如果你并不总是保证有机会获得头头一个TryGetValues方法。



Answer 2:

线下throws exception如果该键不存在。

IEnumerable<string> headerValues = request.Headers.GetValues("MyCustomID");

解决方法:

包括System.Linq的;

IEnumerable<string> headerValues;
var userId = string.Empty;

     if (request.Headers.TryGetValues("MyCustomID", out headerValues))
     {
         userId = headerValues.FirstOrDefault();
     }           


Answer 3:

为了扩大对优素福的回答,我写了一个基于德鲁的关于不存在的头关切这种方法,因为我的单元测试过程中遇到了这种情况。

private T GetFirstHeaderValueOrDefault<T>(string headerKey, 
   Func<HttpRequestMessage, string> defaultValue, 
   Func<string,T> valueTransform)
    {
        IEnumerable<string> headerValues;
        HttpRequestMessage message = Request ?? new HttpRequestMessage();
        if (!message.Headers.TryGetValues(headerKey, out headerValues))
            return valueTransform(defaultValue(message));
        string firstHeaderValue = headerValues.FirstOrDefault() ?? defaultValue(message);
        return valueTransform(firstHeaderValue);
    }

下面是一个例子用法:

GetFirstHeaderValueOrDefault("X-MyGuid", h => Guid.NewGuid().ToString(), Guid.Parse);

也看看@ doguhan-uluca的回答一个更通用的解决方案。



Answer 4:

创建一个新的方法- “ 返回一个单独的HTTP标头值 ”,当你需要从HttpRequestMessage访问多个关键值调用此方法与关键值每次。

public static string GetHeader(this HttpRequestMessage request, string key)
        {
            IEnumerable<string> keys = null;
            if (!request.Headers.TryGetValues(key, out keys))
                return null;

            return keys.First();
        }


Answer 5:

要在@ neontapir的解决方案进一步扩大,这里是一个可以适用于HttpRequestMessage或HttpResponseMessage同样的,不需要手工编码的表达式或函数更通用的解决方案。

using System.Net.Http;
using System.Collections.Generic;
using System.Linq;

public static class HttpResponseMessageExtensions
{
    public static T GetFirstHeaderValueOrDefault<T>(
        this HttpResponseMessage response,
        string headerKey)
    {
        var toReturn = default(T);

        IEnumerable<string> headerValues;

        if (response.Content.Headers.TryGetValues(headerKey, out headerValues))
        {
            var valueString = headerValues.FirstOrDefault();
            if (valueString != null)
            {
                return (T)Convert.ChangeType(valueString, typeof(T));
            }
        }

        return toReturn;
    }
}

用法示例:

var myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");


Answer 6:

对于ASP.Net核心有一个简单的解决方案,如果希望直接在控制器方法使用PARAM:使用[FromHeader]注释。

        public JsonResult SendAsync([FromHeader] string myParam)
        {
        if(myParam == null)  //Param not set in request header
        {
           return null;
        }
        return doSomething();
    }   

附加信息:在我的情况下,“myParam”必须是一个字符串,整数总是0。



Answer 7:

对于ASP.NET,你可以直接从参数中使用获得头在控制器方法这个简单的库/包 。 它提供了一个[FromHeader]就像你在ASP.NET核心:)属性。 例如:

    ...
    using RazHeaderAttribute.Attributes;

    [Route("api/{controller}")]
    public class RandomController : ApiController 
    {
        ...
        // GET api/random
        [HttpGet]
        public IEnumerable<string> Get([FromHeader("pages")] int page, [FromHeader] string rows)
        {
            // Print in the debug window to be sure our bound stuff are passed :)
            Debug.WriteLine($"Rows {rows}, Page {page}");
            ...
        }
    }


Answer 8:

request.Headers.FirstOrDefault( x => x.Key == "MyCustomID" ).Value?.FirstOrDefault()

现代变种:)



Answer 9:

一号线解决方案

var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();


文章来源: How to extract custom header value in Web API message handler?