我有一个传统的。net core 3.1 web应用程序,带有一个自定义的异常过滤器:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
private readonly ILogger _logger;
public CustomExceptionFilterAttribute(ILogger<CustomExceptionFilterAttribute> logger)
{
_logger = logger;
}
public override void OnException(ExceptionContext context)
{
var request = context.HttpContext.Request;
var info = Json from request: POST, PUT, GET + Exception + etc. // <= Pseudo code
_logger.Log(LogLevel.Critical, info);
}
}
我的请求是JSON格式。当代码中的某个地方出错时,我想将请求的内容写入记录器。
我已经尝试从请求中读取。身体流,但它是空的。我在某个地方读到缓冲区被删除后,它已被读取控制器中的动作,但不要如果它是真的。
请求。Form抛出异常。
是否可以获得请求的原始内容?如果是,怎么做?
经过进一步调查,我发现:
HttpContext.Request.Body流默认被删除。
为防止删除,必须在Startup.cs文件中添加以下内容:
app.Use(next => context =>
{
context.Request.EnableBuffering();
return next(context);
});
请求体可以通过以下方式读取:
public override void OnException(ExceptionContext context)
{
context.HttpContext.Request.Body.Position = 0; // important
var bodyAsText = new System.IO.StreamReader(context.HttpContext.Request.Body).ReadToEndAsync().Result;
}