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