Estoy usando Microsoft Asp.net WebApi2 alojado en IIS. Simplemente me gustaría registrar el cuerpo de la solicitud (XML o JSON) y el cuerpo de la respuesta para cada publicación.
No hay nada especial en este proyecto o en el controlador que procesa la publicación. No estoy interesado en utilizar marcos de registro como nLog, elmah, log4net o las funciones de seguimiento integradas de la API web, a menos que sea necesario.
Simplemente quiero saber dónde poner mi código de registro y cómo obtener el JSON o XML real de la solicitud y respuesta entrante y saliente.
Mi método de publicación del controlador:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
usuario2315985
fuente
fuente

Respuestas:
Recomendaría usar un
DelegatingHandler. Entonces no tendrá que preocuparse por ningún código de registro en sus controladores.Simplemente reemplácelo
Trace.WriteLinecon su código de inicio de sesión y registre el controlador deWebApiConfigesta manera:Aquí está la documentación completa de Microsoft para los controladores de mensajes .
fuente
task.Result.ContentdevuelveSystem.Net.Http.ObjectContent. ¿Hay alguna forma de obtener el xml / json sin formato en su lugar?ContinueWithyResultson API peligrosas. Sería mucho mejor usarawaiten su lugar, es decir,var result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;await request.Content.ReadAsStringAsync();no da como resultado un error que indica que el flujo de solicitud ya se ha leído en determinadas circunstancias?Hay varios enfoques para manejar genéricamente el registro de solicitudes / respuestas para cada llamada al método WebAPI:
ActionFilterAttribute: Uno puede escribirActionFilterAttributemétodos personalizados y decorar el controlador / acción para habilitar el registro.Desventaja: debe decorar todos los controladores / métodos (aún puede hacerlo en el controlador base, pero aún así no aborda las preocupaciones transversales.
Anule
BaseControllery controle el registro allí.Con: Estamos esperando / forzando a los controladores a heredar de un controlador base personalizado.
Usando
DelegatingHandler.Ventaja: No estamos tocando el controlador / método aquí con este enfoque. El controlador delegador se encuentra aislado y maneja con gracia el registro de solicitudes / respuestas.
Para obtener un artículo más detallado, consulte este http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi .
fuente
Una de las opciones que tiene es crear un filtro de acción y decorar su WebApiController / ApiMethod con él.
Atributo de filtro
Controlador WebApi
o
Espero que esto ayude.
fuente
Obtener acceso al mensaje de solicitud es fácil. Su clase base
ApiControllercontiene la.Requestpropiedad que, como su nombre indica, contiene la solicitud en forma analizada. Simplemente examínelo para lo que sea que esté buscando para registrar y páselo a su instalación de registro, cualquiera que sea. Este código puede ponerlo al comienzo de su acción, si necesita hacerlo solo para uno o para un puñado.Si necesita hacerlo en todas las acciones (todo significa más que un puñado manejable), entonces lo que puede hacer es anular el
.ExecuteAsyncmétodo para capturar cada llamada de acción para su controlador.fuente
ExecuteAsynces lo que llama el marco, y la implementación de la clase del controlador base es lo que realmente hace que se ejecute la acción. Esto es solo llamar a su registro como parte de una ejecución que ya está ocurriendo. La única penalización aquí es el momento de realizar el registro real.Este parece ser un hilo bastante antiguo, pero vale la pena compartir otra solución.
Puede agregar este método en su archivo global.asax que se activará cada vez que finalice la solicitud HTTP.
fuente
Este es un tema realmente antiguo, pero pasé mucho tiempo (buscando en Internet) para hacer esto, así que solo publicaré mi solución aquí.
Concepto
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
fuente