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.WriteLine
con su código de inicio de sesión y registre el controlador deWebApiConfig
esta manera:Aquí está la documentación completa de Microsoft para los controladores de mensajes .
fuente
task.Result.Content
devuelveSystem.Net.Http.ObjectContent
. ¿Hay alguna forma de obtener el xml / json sin formato en su lugar?ContinueWith
yResult
son API peligrosas. Sería mucho mejor usarawait
en 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 escribirActionFilterAttribute
mé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
BaseController
y 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
ApiController
contiene la.Request
propiedad 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
.ExecuteAsync
método para capturar cada llamada de acción para su controlador.fuente
ExecuteAsync
es 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