c# – 请求/响应记录的响应主体
发布时间:2020-12-15 18:35:09 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个Owin midleware组件,它将记录每个传入的请求和对数据库的响应. 这是我设法得到多远. 我一直在阅读回复.说: Stream does not support reading. 我如何阅读Response.Body? public class LoggingMiddleware : OwinMiddleware { private sta
我正在尝试编写一个Owin midleware组件,它将记录每个传入的请求和对数据库的响应.
这是我设法得到多远. 我一直在阅读回复.说:
我如何阅读Response.Body? 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; await Next.Invoke(context); var mem2 = new MemoryStream(); await context.Response.Body.CopyToAsync(mem2); var logResponse = new log_Response { Headers = Json.Encode(context.Response.Headers),Body = new StreamReader(mem2).ReadToEndAsync().Result,ProcessingTime = sw.Elapsed,ResultCode = context.Response.StatusCode,log_Request = logRequest }; db.log_Response.Add(logResponse); await db.SaveChangesAsync(); } } } 解决方法
Response Body可以这种方式记录:
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,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,log_Request = logRequest }; db.log_Response.Add(logResponse); responseBuffer.Seek(0,SeekOrigin.Begin); await responseBuffer.CopyToAsync(stream); await db.SaveChangesAsync(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |