Response body for request/response Logging

前端 未结 3 713
花落未央
花落未央 2021-02-09 04:55

I\'m trying to write a Owin midleware component that would LOG every incoming request and response to the database.

Here\'s how far I managed to get.

I got stu

3条回答
  •  忘了有多久
    2021-02-09 05:31

    Response Body can be logged in this manner:

    public class LoggingMiddleware : OwinMiddleware
    {
        private static Logger log = LogManager.GetLogger("WebApi");
    
        public LoggingMiddleware(OwinMiddleware next, IAppBuilder app)
            : base(next)
        {
        }
    
        public override async Task Invoke(IOwinContext context)
        {
            using (var db = new HermesEntities())
            {
    
               var sw = new Stopwatch();
               sw.Start();
    
               var logRequest = new log_Request
               {
                   Body = new StreamReader(context.Request.Body).ReadToEndAsync().Result,
                   Headers = Json.Encode(context.Request.Headers),
                   IPTo = context.Request.LocalIpAddress,
                   IpFrom = context.Request.RemoteIpAddress,
                   Method = context.Request.Method,
                   Service = "Api",
                   Uri = context.Request.Uri.ToString(),
                   UserName = context.Request.User.Identity.Name
               };
    
               db.log_Request.Add(logRequest);
               context.Request.Body.Position = 0;
    
               Stream stream = context.Response.Body;
               MemoryStream responseBuffer = new MemoryStream();
               context.Response.Body = responseBuffer;
    
               await Next.Invoke(context);
    
               responseBuffer.Seek(0, SeekOrigin.Begin);
               var responseBody = new StreamReader(responseBuffer).ReadToEnd();
    
               //do logging
    
               var logResponse = new log_Response
               {
                   Headers = Json.Encode(context.Response.Headers),
                   Body = responseBody,
                   ProcessingTime = sw.Elapsed,
                   ResultCode = context.Response.StatusCode,
                   log_Request = logRequest
               };
    
               db.log_Response.Add(logResponse);
    
               responseBuffer.Seek(0, SeekOrigin.Begin);
               await responseBuffer.CopyToAsync(stream);
    
               await db.SaveChangesAsync();
            }
        }
    }
    

提交回复
热议问题