当前位置: 首页 > 编程语言 > C#

Request-ResponseRecordedResponseText分享

时间:2023-04-10 19:13:11 C#

Request/ResponseRecordedResponseText我正在尝试编写一个Owin中间件组件,它将记录每个传入的请求和对数据库的响应。这就是我设法做到的程度。我一直在阅读回复。说:Stream不支持读取。我如何阅读Response.Body?publicLoggingMiddleware(OwinMiddlewarenext,IAppBuilderapp):base(next){}publicoverrideasyncTaskInvoke(IOwinContextcontext){using(vardb=newHermesEntities()){varsw=newStopwatch();sw.开始();varlogRequest=newlog_Request{Body=newStreamReader(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;等待Next.Invoke(上下文);varmem2=newMemoryStream();等待context.Response.Body.CopyToAsync(mem2);varlogResponse=newlog_Response{Headers=Json.Encode(上下文。Response.Headers),Body=newStreamReader(mem2).ReadToEndAsync().Result,ProcessingTime=sw.Elapsed,ResultCode=context.Response.StatusCode,log_Request=logRequest};db.log_Response.Add(logResponse);等待db.SaveChangesAsync();}}}ResponseBody可以这种方式记录:publicclassLoggingMiddleware:OwinMiddleware{privatestaticLoggerlog=LogManager.GetLogger("WebApi");publicLoggingMiddleware(OwinMiddlewarenext,IAppBuilderapp):base(next){}publicoverrideasyncTaskInvoke(IOwinContextcontext){using(vardb=newHermesEntities()){varsw=newStopwatch();sw.开始();varlogRequest=newlog_Request{Body=newStreamReader(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.姓名};db.log_Request.Add(logRequest);context.Request.Body.Position=0;流stream=context.Response.Body;MemoryStreamresponseBuffer=newMemoryStream();context.Response.Body=responseBuffer;等待Next.Invoke(上下文);responseBuffer.Seek(0,SeekOrigin.Begin);varresponseBody=newStreamReader(responseBuffer).ReadToEnd();//记录varlogResponse=newlog_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);等待响应缓冲区。CopyToAsync(流);等待db.SaveChangesAsync();对于Katana主机,响应主体是默认的只写网络流,您需要将其替换为MemoryStream,读取流,记录内容,然后将内存流内容复制回原始网络流。顺便说一句,如果您的中间件读取请求文字,下游组件则不能,除非请求文字被缓冲。因此,您可能还想考虑缓冲请求正文。如果您想查看一些代码,http://lbadri.wordpress.com/2013/08/03/owin-authentication-middleware-for-hawk-in-thinktecture-identitymodel-45/可能是一个起点。查看HawkAuthenticationHandler类。我通过将请求正文写入OWIN环境字典的action属性来解决这个问题。之后,日志中间件可以通过密钥访问它。公共类LogResponseBodyInterceptorAttribute:ActionFilterAttribute{公共覆盖异步任务OnActionExecutedAsync(HttpActionExecutedContextactionExecutedContext,CancellationTokencancellationToken){if(actionExecutedContext?.Response?.ContentisObjectContent){actionExecutedContext.Request.GetOwinContext().Environment["log-responseBody"]=awaitactionExecutedContext.Response.Content.ReadAsStringAsync();然后在中间件中:以上就是C#学习教程:请求/响应记录的响应文本分享的全部内容,如果对大家有用需要进一步了解C#希望大家付费更多关注教程—publicclassRequestLoggingMiddleware{...privatevoidLogResponse(IOwinContextowinContext){varmessage=newStringBuilder().AppendLine($"{owinContext.Response.StatusCode}").AppendLine(string.Join(Environment.NewLine,owinContext.Response.Headers.Select(x=>$"{x.Key}:{string.Join(";",x.Value)}")));如果(owinContext.Environment.ContainsKey(“log-responseBody”)){varresponseBody=(字符串)owinContext。环境[“日志响应体”];message.AppendLine().AppendLine(responseBody);}varlogEvent=newLogEventInfo{Level=LogLevel.Trace,Properties={{"correlationId",owinContext.Environment["correlation-id"]},{"entryType","Response"}},Message=message.ToString()};_logger.Log(日志事件);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: