【问题标题】:.Net core Action Filter is being applied to all controllers ignoring decorators.Net core Action Filter 被应用于所有控制器忽略装饰器
【发布时间】:2020-03-17 12:57:19
【问题描述】:

我定义了一个IAsyncActionFilter(一个微软Action Filter)如下:

public class CustomActionFilter : IAsyncActionFilter
{

    public CustomActionFilter()
    {
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // do something
    }
}

我在ConfigureServicesstartup 下添加了它的声明:

services.AddScoped<CustomActionFilter>();

ConfigureServices 的末尾,我将其配置为Filter

services.AddMvc((opts) =>
{
    opts.EnableEndpointRouting = false;
    opts.Filters.Add(new CustomActionFilter());
});

最后,我在控制器中使用装饰器,用于特定调用,以表明我希望该过滤器应用于该调用:

[ApiController]
[Route("a")]
public class AController : Controller
{

    public AController()
    {
    }

    [HttpGet("aa")]
    [ServiceFilter(typeof(CustomActionFilter))]
    public async Task<IActionResult> DoubleA()
    {
        // do something after the filter is called
    }
}

到目前为止,一切都运行良好,CustomActionFilterDoubleA 控制器创建前后被调用。

问题是 所有 控制器和路由都在使用这个 CustomActionFilter 而不管装饰器。

例如在这个控制器中:

[ApiController]
[Route("b")]
public class BController : Controller
{

    public BController()
    {
    }

    [HttpGet("bb")]
    public async Task<IActionResult> DoubleB()
    {
        // do something without any kind of Filter inervention
    }
}

CustomActionFilter 也在 DoubleB 之前和之后被调用。

有什么想法我在这里做错了吗?

【问题讨论】:

    标签: c# asp.net-core .net-core action-filter asp.net-core-3.1


    【解决方案1】:

    当您将过滤器添加到您的启动时,它会根据 the docs 全局应用

    如果您希望它仅适用于您的操作,则应将其从启动中删除并将该属性保留在操作上应该可以工作。

    从启动中删除这一行应该可以解决问题:

    opts.Filters.Add(new CustomActionFilter());
    

    【讨论】:

    • 确实,我没有仔细阅读这部分的文档。谢谢!
    猜你喜欢
    • 2021-11-24
    • 2020-10-25
    • 2021-08-26
    • 2015-02-01
    • 2020-11-30
    • 2017-10-25
    • 2020-11-23
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多