Asp.net core 已处理Asp.Net核心ActionFilter上下文请求正文
我有一个asp.net核心web api项目,在该项目中,我创建了一个操作过滤器来记录对api的每个调用Asp.net core 已处理Asp.Net核心ActionFilter上下文请求正文,asp.net-core,dependency-injection,asp.net-core-webapi,Asp.net Core,Dependency Injection,Asp.net Core Webapi,我有一个asp.net核心web api项目,在该项目中,我创建了一个操作过滤器来记录对api的每个调用 public class RequestLoggerActionFilter : ActionFilterAttribute { private readonly ILogger _logger; public RequestLoggerActionFilter(ILoggerFactory loggerFactory) { _logger = lo
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);
}
}
这段代码在大多数情况下都可以正常工作。当我的控制器方法使用createDataAction
方法返回201代码时,我遇到了问题
return CreatedAtAction("Get", new { Id= myObject.Id });
问题是,当我点击创建对象的控制器方法时,它第一次进入actionfilter并正确记录请求。然后,当到达返回行时,它会第二次点击我的actionfilter(我不确定为什么会发送第二个请求,我想这与重定向是一样的)。第二次执行我的actionFilter的OnActionExecuting
,这行代码抛出异常
request.Body.Position = 0;
“无法访问已释放的对象。”
我的请求的主体已被处理。我的ActionFilter以这种方式注册到Startup.cs
文件中
services.AddMvc(c =>
{
c.Filters.Add(typeof(RequestLoggerActionFilter));
}
);
我的actionFilter的生命周期是有范围的,我也尝试了Transient,但它没有解决问题
services.AddScoped<RequestLoggerActionFilter>();
services.addScope();
我用request.EnableRewind()做了一个测试代码>和下面的代码,它与createDataAction
一起工作
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);
}
}
我很困惑。一个请求将调用OnActionExecuting,然后调用OnActionExecuted。这是正常的流量。您写的关于OnActionExecuted的内容,但您的代码仅显示OnActionExecuting…此外,行request.Body.Position=0根据我的测试(ASP.NET Core 2.0和2.1),code>总是抛出NotSupportedException。你的.NET Core版本是什么?@AdamSimon我使用.NET Core 2.1,可以确认这行代码是否正常工作fine@ChristophLütjen此actionfilter的目的是记录每个请求。我在OnActionExecuting上做这件事,我在OnActionExecuted上没有别的事要做。actionFilter不是强制实现mvc工作流的每个事件的,但仍然存在相同的问题。您能告诉我如何在startup类中注册actionFilter,以及如何在serviceprovider上注册它吗。另外,您能否确认这段代码被命中两次,一次是在到达控制器的action方法时,第二次是在调用方法CreateDataAction时?@NicolasBoisvert这是我的。你能通过github与我们分享一个可复制的项目吗?