gpt4 book ai didi

asp.net-core - Asp.Net core ActionFilter 上下文请求体处理

转载 作者:行者123 更新时间:2023-12-05 07:30:27 32 4
gpt4 key购买 nike

我有一个 asp.net 核心 web api 项目,我在其中创建了一个操作过滤器来记录对 api 的每个调用

public class RequestLoggerActionFilter : ActionFilterAttribute
{
private readonly ILogger _logger;

public RequestLoggerActionFilter(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("RequestLogger");
}

public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.HttpContext.Request;
request.Body.Position = 0;

using (var reader = new StreamReader(request.Body))
{
var bodyString = reader.ReadToEnd();
_logger.LogInformation($"API call recevied on {request.Method.ToUpper()} {request.Path} RequestBody: {bodyString}");
}

base.OnActionExecuting(context);
}
}

这段代码在大多数情况下都可以正常工作。当我的 Controller 方法使用 CreatedAtAction 方法返回 201 代码时出现问题

return CreatedAtAction("Get", new { Id= myObject.Id });

问题是,当我点击创建对象的 Controller 方法时,它第一次进入我的 actionfilter 并正确记录请求。然后,当到达返回行时,它会第二次访问我的 actionfilter(我不确定为什么要发送第二个请求,我猜它的作用与重定向相同)。第二次执行我的actionFilter的OnActionExecuting,这行代码抛出异常

request.Body.Position = 0;

'Cannot access a disposed object.'

我的请求正文已处理。我的 ActionFilter 在 Startup.cs 文件中以这种方式注册

services.AddMvc(c =>
{
c.Filters.Add(typeof(RequestLoggerActionFilter));
}
);

我的 actionFilter 的生命周期是 Scoped,我也试过 Transient,但它没有解决问题。

services.AddScoped<RequestLoggerActionFilter>();

最佳答案

我用 request.EnableRewind(); 和下面的代码进行了测试,它与 CreatedAtAction 一起使用。

    public class RequestLoggerActionFilter : ActionFilterAttribute
{
private readonly ILogger _logger;

public RequestLoggerActionFilter(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("RequestLogger");
}

public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.HttpContext.Request;
request.EnableRewind();
request.Body.Position = 0;

using (var reader = new StreamReader(request.Body))
{
var bodyString = reader.ReadToEnd();
_logger.LogInformation($"API call recevied on {request.Method.ToUpper()} {request.Path} RequestBody: {bodyString}");
}

base.OnActionExecuting(context);
}
}

关于asp.net-core - Asp.Net core ActionFilter 上下文请求体处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52299925/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com