我目前在我的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文档)实例来访问一个单的自定义请求头?
试试这样的方法。
IEnumerable<string> headerValues = request.Headers.GetValues("MyCustomID");
var id = headerValues.FirstOrDefault();
如果你不能保证总是能够访问头文件,你也可以使用头文件的TryGetValues方法。
如果键不存在,下面这行 "抛出异常"。
IEnumerable<string> headerValues = request.Headers.GetValues("MyCustomID");
绕开工作:
包括System.Linq.Total.Total.Total.Total.Total.Total;
IEnumerable<string> headerValues;
var userId = string.Empty;
if (request.Headers.TryGetValues("MyCustomID", out headerValues))
{
userId = headerValues.FirstOrDefault();
}
为了扩展Youssef'的回答,我是基于Drew'对头文件不存在的担忧而写的这个方法,因为我在单元测试中遇到了这种情况。
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 '的答案,了解更多的通用解决方案。