如何在.net ExceptionFilter中读取请求内容



我有一个传统的。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;
}

最新更新