c# – 请求/响应记录的响应主体

前端之家收集整理的这篇文章主要介绍了c# – 请求/响应记录的响应主体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个Owin midleware组件,它将记录每个传入的请求和对数据库的响应.

这是我设法得到多远.

我一直在阅读回复.说:

Stream does not support reading.

我如何阅读Response.Body?

  1. public class LoggingMiddleware : OwinMiddleware
  2. {
  3. private static Logger log = LogManager.GetLogger("WebApi");
  4.  
  5. public LoggingMiddleware(OwinMiddleware next,IAppBuilder app)
  6. : base(next)
  7. {
  8. }
  9.  
  10. public override async Task Invoke(IOwinContext context)
  11. {
  12. using (var db = new HermesEntities())
  13. {
  14.  
  15. var sw = new Stopwatch();
  16. sw.Start();
  17.  
  18. var logRequest = new log_Request
  19. {
  20. 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
  21.  
  22. };
  23. db.log_Request.Add(logRequest);
  24. context.Request.Body.Position = 0;
  25.  
  26. await Next.Invoke(context);
  27.  
  28. var mem2 = new MemoryStream();
  29. await context.Response.Body.CopyToAsync(mem2);
  30.  
  31. var logResponse = new log_Response
  32. {
  33. Headers = Json.Encode(context.Response.Headers),Body = new StreamReader(mem2).ReadToEndAsync().Result,ProcessingTime = sw.Elapsed,ResultCode = context.Response.StatusCode,log_Request = logRequest
  34. };
  35.  
  36. db.log_Response.Add(logResponse);
  37.  
  38. await db.SaveChangesAsync();
  39. }
  40. }
  41. }

解决方法

Response Body可以这种方式记录:
  1. public class LoggingMiddleware : OwinMiddleware
  2. {
  3. private static Logger log = LogManager.GetLogger("WebApi");
  4.  
  5. public LoggingMiddleware(OwinMiddleware next,IAppBuilder app)
  6. : base(next)
  7. {
  8. }
  9.  
  10. public override async Task Invoke(IOwinContext context)
  11. {
  12. using (var db = new HermesEntities())
  13. {
  14.  
  15. var sw = new Stopwatch();
  16. sw.Start();
  17.  
  18. var logRequest = new log_Request
  19. {
  20. Body = new StreamReader(context.Request.Body).ReadToEndAsync().Result,UserName = context.Request.User.Identity.Name
  21. };
  22.  
  23. db.log_Request.Add(logRequest);
  24. context.Request.Body.Position = 0;
  25.  
  26. Stream stream = context.Response.Body;
  27. MemoryStream responseBuffer = new MemoryStream();
  28. context.Response.Body = responseBuffer;
  29.  
  30. await Next.Invoke(context);
  31.  
  32. responseBuffer.Seek(0,SeekOrigin.Begin);
  33. var responseBody = new StreamReader(responseBuffer).ReadToEnd();
  34.  
  35. //do logging
  36.  
  37. var logResponse = new log_Response
  38. {
  39. Headers = Json.Encode(context.Response.Headers),Body = responseBody,log_Request = logRequest
  40. };
  41.  
  42. db.log_Response.Add(logResponse);
  43.  
  44. responseBuffer.Seek(0,SeekOrigin.Begin);
  45. await responseBuffer.CopyToAsync(stream);
  46.  
  47. await db.SaveChangesAsync();
  48. }
  49. }
  50. }

猜你在找的C#相关文章