Atualmente, tenho um manipulador de mensagens no meu serviço de API da Web que substitui 'SendAsync' da seguinte maneira:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//implementation
}
Nesse código, preciso inspecionar um valor de cabeçalho de solicitação adicionado personalizado chamado MyCustomID
. O problema é quando eu faço o seguinte:
if (request.Headers.Contains("MyCustomID")) //OK
var id = request.Headers["MyCustomID"]; //build error - not OK
...Eu recebi a seguinte mensagem de erro:
Não é possível aplicar a indexação com [] a uma expressão do tipo 'System.Net.Http.Headers.HttpRequestHeaders'
Como acessar um único cabeçalho de solicitação personalizada por meio da instância HttpRequestMessage
( Documentação do MSDN ) passada para esse método substituído?
c#
asp.net-web-api
httprequest
atconway
fonte
fonte
request.Headers.Get("MyCustomID");
?Get' on the
tipo HttpRequestHeaders. A mensagem: "Não é possível resolver o símbolo 'Get'" é produzida.Respostas:
Tente algo como isto:
Há também um método TryGetValues nos cabeçalhos que você pode usar se nem sempre garantir o acesso ao cabeçalho.
fonte
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
e,Some-Header: two
em seguida, na mesma solicitação. Alguns idiomas descartam silenciosamente "um", mas isso está incorreto. Está no RFC, mas estou com preguiça de encontrá-lo agora.A linha abaixo
throws exception
se a chave não existir.Gambiarra :
Inclua System.Linq;
fonte
Para expandir a resposta de Youssef, escrevi esse método com base nas preocupações de Drew sobre o cabeçalho não existente, porque me deparei com essa situação durante o teste de unidade.
Aqui está um exemplo de uso:
Veja também a resposta de @ doguhan-uluca para uma solução mais geral.
fonte
Func
eAction
são construções genéricas de assinatura de delegado criadas no .NET 3.5 e superior. Ficaria feliz em discutir perguntas específicas sobre o método, mas recomendo aprender sobre elas primeiro.HttpRequestMessage
é inicializado com uma coleção de cabeçalhos vazia, que não é nula. Essa função acaba retornando o valor padrão se a solicitação for nula.Crie um novo método - ' Retorna um valor de cabeçalho HTTP individual ' e chame esse método com valor-chave sempre que precisar acessar vários valores-chave em HttpRequestMessage.
fonte
Para expandir ainda mais a solução da @ neontapir, aqui está uma solução mais genérica que pode ser aplicada ao HttpRequestMessage ou HttpResponseMessage igualmente e não requer expressões ou funções codificadas manualmente.
Uso da amostra:
fonte
GetFirstHeaderValueOrDefault
tem dois parâmetros, por isso reclama sobre a falta de parâmetros ao chamar como uso de amostravar myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
Estou perdendo alguma coisa?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
obtido Não há argumento fornecido que corresponda ao parâmetro formal obrigatório 'headerKey' de 'HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, string)'using HttpResponseMessageExtensions
no arquivo que está tentando usar esta extensão?Para o ASP.Net Core, existe uma solução fácil, se você quiser usar o parâmetro diretamente no método do controlador: Use a anotação [FromHeader].
Informações adicionais: No meu caso, o "myParam" tinha que ser uma string, int sempre foi 0.
fonte
Para o ASP.NET, você pode obter o cabeçalho diretamente do parâmetro no método controller usando esta simples biblioteca / pacote . Ele fornece um
[FromHeader]
atributo exatamente como o ASP.NET Core :). Por exemplo:fonte
Solução de uma linha
fonte
request
énull
? Também é possível. Ou o queMyCustomID
acontece se uma string vazia ou não for igual afoo
? Depende do contexto, portanto, esta resposta descreve apenas o caminho e toda a validação e lógica de negócios que você precisa adicionar por conta própriavariante moderna :)
fonte