143 votos

Cómo extraer valor de encabezado personalizado en la Web de la API de controlador de mensaje?

Actualmente tengo un controlador de mensaje en mi Web API de servicio que reemplaza 'SendAsync' de la siguiente manera:

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

Dentro de este código necesito inspeccionar una costumbre agregado de valor de encabezado de solicitud nombre MyCustomID. El problema es cuando hago lo siguiente:

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

...Me sale el siguiente mensaje de error:

No se puede aplicar la indexación con [] a una expresión del tipo 'Sistema.Net.Http.Los encabezados.HttpRequestHeaders'

¿Cómo puedo acceder a un único personalizado encabezado de solicitud a través de la HttpRequestMessage (Documentación de MSDN) instancia que se ha pasado en este método se reemplaza?

240voto

Youssef Moussaoui Puntos 5494

Intentar algo como esto:

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

También hay un TryGetValues método en los Encabezados de que usted puede utilizar si usted no está siempre garantizado para tener acceso a la cabecera.

37voto

SharpCoder Puntos 1167

La línea de abajo throws exception si la clave no existe.

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

El trabajo en torno a :

Incluir El Sistema.Linq;

IEnumerable<string> headerValues;
var userId = string.Empty;
var keyFound  = request.Headers.TryGetValues("MyCustomID", out headerValues);
     if (keyFound)
     {
         userId = headerValues.FirstOrDefault();
     }           

16voto

neontapir Puntos 2692

Para ampliar sobre Youssef la respuesta, escribí este método basado Drew preocupaciones acerca de la cabecera no existente, porque me encontré en esta situación durante la prueba de unidad.

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);
    }

He aquí un ejemplo de uso:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X