Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 已处理Asp.Net核心ActionFilter上下文请求正文_Asp.net Core_Dependency Injection_Asp.net Core Webapi - Fatal编程技术网

Asp.net core 已处理Asp.Net核心ActionFilter上下文请求正文

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

我有一个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);
    }
}
这段代码在大多数情况下都可以正常工作。当我的控制器方法使用
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总是抛出NotSupportedException。你的.NET Core版本是什么?@AdamSimon我使用.NET Core 2.1,可以确认这行代码是否正常工作fine@ChristophLütjen此actionfilter的目的是记录每个请求。我在OnActionExecuting上做这件事,我在OnActionExecuted上没有别的事要做。actionFilter不是强制实现mvc工作流的每个事件的,但仍然存在相同的问题。您能告诉我如何在startup类中注册actionFilter,以及如何在serviceprovider上注册它吗。另外,您能否确认这段代码被命中两次,一次是在到达控制器的action方法时,第二次是在调用方法CreateDataAction时?@NicolasBoisvert这是我的。你能通过github与我们分享一个可复制的项目吗?