【发布时间】:2021-11-10 23:43:35
【问题描述】:
在将响应正文复制到流后,我在 .Net Core 3.1 WebApi 中遇到了 UseExceptionHandler 问题,开始无法触发。我正在使用中间件来拦截 webapi 项目的传入请求和传出响应,并将记录记录到表中。在调用 stream.CopyToAsync() 方法之前它工作正常。之后的任何异常都不会触发 ExceptionHandler,即使本地 try/catch 仍然会捕获异常并且在 catch 块中重新抛出异常仍然不会导致 ExceptionHandler 触发。
调用方法
public async Task Invoke(HttpContext context)
{
Stream originalBody = context.Response.Body;
try
{
using var memStream = new MemoryStream();
context.Response.Body = memStream;
await _next(context).ConfigureAwait(false);
await LogResponse(context, originalBody, memStream).ConfigureAwait(false);
}
catch (Exception ex)
{
throw ex;
}
finally
{
context.Response.Body = originalBody;
originalBody.Close();
}
}
}
日志响应方法
private async Task LogResponse(HttpContext context, Stream originalBody, MemoryStream stream)
{
stream.Seek(0, SeekOrigin.Begin);
string body = await new StreamReader(stream).ReadToEndAsync().ConfigureAwait(false);
stream.Seek(0, SeekOrigin.Begin);
//This is the line of code that breaks UseExceptionHandling pipeline
await stream.CopyToAsync(originalBody).ConfigureAwait(false);
var resp = new ApiLogItemRequest()
{
AppName = "AppName",
CreatedBy = "AppName",
DateTime = DateTime.Now,
RawBodyJson = body,
TraceIdentifier = context.TraceIdentifier
};
await _logHelper.LogRawHttpBodyItem(resp);
}
任何想法或提示将不胜感激。谢谢!
【问题讨论】:
标签: .net asp.net-core exception asp.net-core-webapi middleware