Actualmente tengo un controlador de mensajes en mi servicio de API web que anula 'SendAsync' de la siguiente manera:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//implementation
}
Dentro de este código, necesito inspeccionar un valor de encabezado de solicitud agregado personalizado llamado MyCustomID
. El problema es cuando hago lo siguiente:
if (request.Headers.Contains("MyCustomID")) //OK
var id = request.Headers["MyCustomID"]; //build error - not OK
... recibo el siguiente mensaje de error:
No se puede aplicar la indexación con [] a una expresión de tipo 'System.Net.Http.Headers.HttpRequestHeaders'
¿Cómo puedo acceder a un único encabezado de solicitud personalizada a través de la instancia HttpRequestMessage
( Documentación de MSDN ) que se pasa a este método anulado?
c#
asp.net-web-api
httprequest
atconway
fuente
fuente
request.Headers.Get("MyCustomID");
?Get' on the
tipo HttpRequestHeaders. Aparece el mensaje: "No se puede resolver el símbolo 'Obtener'".Respuestas:
Intenta algo como esto:
También hay un método TryGetValues en los encabezados que puede usar si no siempre se garantiza que tenga acceso al encabezado.
fuente
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
y luegoSome-Header: two
en la misma solicitud. Algunos idiomas descartan en silencio "uno", pero eso es incorrecto. Está en el RFC pero soy demasiado vago para encontrarlo ahora.La línea de abajo
throws exception
si la clave no existe.Solución alterna :
Incluir System.Linq;
fuente
Para ampliar la respuesta de Youssef, escribí este método basado en las preocupaciones de Drew sobre el encabezado no existente, porque me encontré con esta situación durante las pruebas unitarias.
Aquí hay un ejemplo de uso:
También eche un vistazo a la respuesta de @ doguhan-uluca para una solución más general.
fuente
Func
yAction
son construcciones genéricas de firma de delegado integradas en .NET 3.5 y superiores. Me encantaría discutir preguntas específicas sobre el método, pero recomendaría aprender sobre ellas primero.HttpRequestMessage
con una colección de encabezados vacía, que no es nula. Esta función termina devolviendo el valor predeterminado si la solicitud es nula.Cree un nuevo método: ' Devuelve un valor de encabezado HTTP individual ' y llame a este método con un valor clave cada vez que necesite acceder a varios valores clave desde HttpRequestMessage.
fuente
Para ampliar aún más la solución de @ neontapir, aquí hay una solución más genérica que puede aplicarse a HttpRequestMessage o HttpResponseMessage por igual y no requiere expresiones o funciones codificadas a mano.
Uso de la muestra:
fuente
GetFirstHeaderValueOrDefault
tiene dos parámetros, por lo que se queja de la falta de parámetros cuando se llama como muestra de usovar myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
¿Me estoy perdiendo algo?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
obtuvo No hay ningún argumento dado que corresponda al parámetro formal requerido 'headerKey' de 'HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, string)'using HttpResponseMessageExtensions
sobre el archivo que estás intentando usar esta extensión?Para ASP.Net Core hay una solución fácil si desea usar el parámetro directamente en el método del controlador: use la anotación [FromHeader].
Información adicional: en mi caso, "myParam" tenía que ser una cadena, int siempre era 0.
fuente
Para ASP.NET, puede obtener el encabezado directamente del parámetro en el método del controlador utilizando esta biblioteca / paquete simple . Proporciona un
[FromHeader]
atributo como el que tiene en ASP.NET Core :). Por ejemplo:fuente
Solución de una línea
fuente
request
esnull
? También es posible. ¿O quéMyCustomID
pasa si una cadena vacía o no es igual afoo
? Depende del contexto, por lo que esta respuesta solo describe la forma y toda la validación y lógica de negocios que necesita agregar por su cuentavariante moderna :)
fuente