들어오는 모든 요청과 응답을 데이터베이스에 기록하는 Owin midleware 구성 요소를 작성하려고합니다.요청/응답 로깅을위한 응답 본문
나는 그럭저럭 얻을 수 있었다.
나는 response.body를 읽으 려 고 막혔다. 덧붙여 :
스트림은 읽기를 지원하지 않습니다.
어떻게 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();
}
}
}
이 작업을 받으셨어요? –
일종의, 어리석은 work arounds와 더불어, 그러나 내가 처음에 원했던 것에 따라. 간단히 - 아니 – Marty
이것은 나를 위해 그것을 해결 : http://stackoverflow.com/questions/26214113/how-can-i-safely-intercept-the-response-stream-in-a-custom-owin-middleware –