gpt4 book ai didi

c# - 请求/响应日志记录的响应正文

转载 作者:太空狗 更新时间:2023-10-29 20:49:12 24 4
gpt4 key购买 nike

我正在尝试编写一个 Owin 中间件组件,它将记录每个传入的请求和对数据库的响应。

这是我设法取得的进展。

我在阅读 response.body 时卡住了。说:

Stream does not support reading.

如何阅读 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,
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();
}
}
}

关于c# - 请求/响应日志记录的响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25584626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com