В настоящее время в моей службе 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 ), переданный в этот переопределенный метод?
c#
asp.net-web-api
httprequest
atconway
источник
источник
request.Headers.Get("MyCustomID");
?Get' on the
Типа HttpRequestHeaders не существует . Появится сообщение: «Не удается разрешить символ« Получить »».Ответы:
Попробуйте что-то вроде этого:
В заголовках также есть метод TryGetValues, который можно использовать, если не всегда гарантирован доступ к заголовку.
источник
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
и тогдаSome-Header: two
в том же запросе. Некоторые языки молча отбрасывают «один», но это неверно. Это в RFC, но мне лень его сейчас найти.Строка ниже,
throws exception
если ключ не существует.Работа вокруг:
Включить System.Linq;
источник
Чтобы расширить ответ Юсефа, я написал этот метод на основе опасений Дрю о том, что заголовок не существует, потому что я столкнулся с этой ситуацией во время модульного тестирования.
Вот пример использования:
Также взгляните на ответ @ doguhan-uluca для более общего решения.
источник
Func
иAction
являются общими конструкциями подписи делегата, встроенными в .NET 3.5 и выше. Я был бы рад обсудить конкретные вопросы о методе, но я бы рекомендовал узнать о них в первую очередь.HttpRequestMessage
инициализируется с пустой коллекцией заголовков, которая не является нулевой. Эта функция возвращает значение по умолчанию, если запрос равен нулю.Создайте новый метод - « Возвращает отдельное значение заголовка HTTP » и вызывайте этот метод со значением ключа каждый раз, когда вам нужно получить доступ к нескольким значениям ключа из HttpRequestMessage.
источник
Чтобы дополнительно расширить решение @ neontapir, вот более общее решение, которое может в равной степени применяться к HttpRequestMessage или HttpResponseMessage и не требует выражений или функций, закодированных вручную.
Пример использования:
источник
GetFirstHeaderValueOrDefault
имеет два параметра, поэтому он жалуется на отсутствие параметра при вызове в качестве примера использования.var myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
Я что-то упустил?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
есть Там не аргумент , учитывая , что соответствует требуемому формальному параметру «headerKey» из «HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, строка)»using HttpResponseMessageExtensions
файл, который пытаетесь использовать это расширение?Для ASP.Net Core существует простое решение, если вы хотите использовать параметр непосредственно в методе контроллера: используйте аннотацию [FromHeader].
Дополнительная информация: в моем случае «myParam» должен был быть строкой, int всегда был 0.
источник
Для ASP.NET вы можете получить заголовок непосредственно из параметра в методе контроллера, используя эту простую библиотеку / пакет . Он предоставляет
[FromHeader]
атрибут, как у вас в ASP.NET Core :). Например:источник
Одноканальное решение
источник
request
этоnull
? Это также возможно. Или что, еслиMyCustomID
это пустая строка или не равноfoo
? Это зависит от контекста, поэтому этот ответ просто описывает путь и всю валидацию и бизнес-логику, которые вы должны добавить самостоятельносовременный вариант :)
источник