usar una restful mvc metodo invocar consumir conectar con como c# asp.net asp.net-mvc-4 asp.net-web-api web-api-contrib

c# - una - Encabezado sin respuesta en DelegatingHandler



consumir metodo get c# (3)

Los controladores de mensajes se llaman en el mismo orden en que aparecen en la colección MessageHandlers . Debido a que están anidados, el mensaje de respuesta viaja en la otra dirección. Es decir, el último controlador es el primero en recibir el mensaje de respuesta.

Asegúrese de que el controlador de registro esté registrado al principio de la canalización. Preferiblemente primero.

public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new LoggingHandler(...)); //...add other handlers config.MessageHandlers.Add(new MessageHandler1()); config.MessageHandlers.Add(new MessageHandler2()); // Other code not shown... } }

De esa manera, cualquier otro manejador tendría la oportunidad de completar la respuesta y tener esa información registrada.

También puede simplificar la clase utilizando la sintaxis asíncrona / espera para que el acceso a la respuesta sea más limpio.

public class LoggingHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { //...Extract and log request LogRequest(request); // Send the request on to the inner handler(s) and get the response var response = await base.SendAsync(request, cancellationToken); //...Extract details from response for logging LogResponse(response); return response; } private void LogRequest(HttpRequestMessage request) { //... code removed for brevity } private void LogResponse(HttpResponseMessage response) { //... code removed for brevity } }

Debe poder acceder a los detalles necesarios de la respuesta antes de devolverla.

Referencia: Controladores de mensajes HTTP en la API web de ASP.NET

Estoy intentando registrar los encabezados de respuesta HTTP de mi proyecto de API web.

El proyecto está desarrollado por VS2012, .NET 4.5 y ASP.NET MVC 4.

He escrito una subclase de DelegatingHandler como esta:

public class LoggingHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // Execute the request return base.SendAsync(request, cancellationToken).ContinueWith(task => { var response = task.Result; return response; }); } }

Sin embargo, el problema es que no puedo obtener los valores de encabezado de la response . response.Headers es una colección vacía, response.Content.Headers no contiene más que una clave llamada Content-Type , y HttpContext.Current es null .

He visto el código de WebAPIContrib que usa la misma lógica para registrar los encabezados, pero su código tampoco parece funcionar.

Entonces, ¿cómo debo rastrear los encabezados de respuesta HTTP en el proyecto de API web?


Debes mirar en el lugar correcto:

request.Content.Headers.ContentType

Asumiendo que hay un Content-Type: application/json , entonces lo anterior devolverá "application/json" .

Básicamente, algunos encabezados están asociados con el Contenido y ahí es donde deberías leerlos.

Lo mismo es cierto para los encabezados de respuesta. Dependiendo de su tipo, es posible que necesite extraerlos del contenido de la respuesta (para las solicitudes que devuelven el cuerpo)

response.Content.Headers.ContentType


Pruebe el siguiente código.

return base.SendAsync(request, cancellationToken).ContinueWith( task => { var headers = task.Result.ToString(); var body = task.Result.Content.ReadAsStringAsync().Result; // RETURN THE ORIGINAL RESULT var response = task.Result; return response; } );