Tôi đang cố gắng viết một thành phần phần mềm midleware của Owin sẽ LOG mỗi yêu cầu gửi đến và phản hồi lại cơ sở dữ liệu.Nội dung phản hồi cho yêu cầu/phản hồi Ghi nhật ký
Đây là cách tôi quản lý được.
Tôi gặp khó khăn khi đọc phản hồi.body. Nói:
Luồng không hỗ trợ đọc.
Làm cách nào để đọc phản hồi.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();
}
}
}
Cậu làm việc này? –
loại, với một số công việc ngu ngốc xung quanh, nhưng không phải như tôi ban đầu muốn. Trong ngắn hạn - NO – Marty
Điều này giải quyết nó cho tôi: http://stackoverflow.com/questions/26214113/how-can-i-safely-intercept-the-response-stream-in-a-custom-owin-middleware –