ASP.net核心中api和mvc端点的单独筛选器

ASP.net核心中api和mvc端点的单独筛选器,asp.net,asp.net-core,Asp.net,Asp.net Core,有没有办法将我的MVC控制器的过滤器和用于web api的过滤器分开?比如: services.AddMvc(options => { options.Filters.Add(new Filter1()); //MVC options.Filters.Add(new Filter2());//web api only? }); 正如我在评论中所说,在ASP.NETCore中,MVC和WebAPI控制器没有分离。所有控制器都派生自Microsoft

有没有办法将我的MVC控制器的过滤器和用于web api的过滤器分开?比如:

services.AddMvc(options =>
{
     options.Filters.Add(new Filter1()); //MVC           
     options.Filters.Add(new Filter2());//web api only?
});

正如我在评论中所说,在ASP.NETCore中,MVC和WebAPI控制器没有分离。所有控制器都派生自Microsoft.AspNetCore.Mvc.Controller

它与ASP.NET MVC和Web API完全不同,在ASP.NET MVC和Web API中,过滤器和过滤器集合属于两个不同的领域

所以,您不能期望ASP.NETCore会根据您的条件为您提供内置的分离过滤器的方法
mvcopions
只有
过滤器
集合

但是,您可以通过使用聚合其他应用程序过滤器的操作过滤器来轻松满足您的需求,并“知道”它是Web Api还是Mvc操作,以及是否应该执行底层过滤器

以下是一个示例:

public class SeparateActionFilter : IActionFilter
{
    private enum FilterType
    {
        Mvc,
        WebApi
    }

    private readonly IActionFilter innerFilter;
    private readonly FilterType filterType;

    public static IActionFilter MvcFilter(IActionFilter innerFilter)
    {
        return new SeparateActionFilter(innerFilter, FilterType.Mvc);
    }

    public static IActionFilter WebApiFilter(IActionFilter innerFilter)
    {
        return new SeparateActionFilter(innerFilter, FilterType.WebApi);
    }

    private SeparateActionFilter(IActionFilter innerFilter, FilterType filterType)
    {
        this.innerFilter = innerFilter ?? throw new ArgumentNullException(nameof(innerFilter));
        this.filterType = filterType;
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (ShouldExecute(context))
        {
            innerFilter.OnActionExecuting(context);
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (ShouldExecute(context))
        {
            innerFilter.OnActionExecuted(context);
        }
    }

    private bool ShouldExecute(FilterContext context)
    {
        return filterType == FilterType.Mvc && IsMvcFilter(context) ||
                filterType == FilterType.WebApi && !IsMvcFilter(context);
    }

    private bool IsMvcFilter(FilterContext context)
    {
        //  You logic for separation of MVC and Web Api filters.
        //  You could make checks on context.ActionDescriptor, context.HttpContext or context.RouteData.

        return true;
    }
}
注册过滤器:

services.AddMvc(options =>
{
    options.Filters.Add(SeparateActionFilter.MvcFilter(new Filter1()));    // MVC 
    options.Filters.Add(SeparateActionFilter.WebApiFilter(new Filter2())); //   web api only
});

您只需使用MVC和Web API过滤器之间的分离逻辑实现
IsMvcFilter()
方法。在这种方法中,您可以访问
FilterContext
以及所有必需的信息,如
ActionDescriptor
HttpContext
RouteData

当您谈论ASP.Net核心控制器时,如何将它们划分为MVC和Web API控制器?在ASP.Net Core中,所有控制器都派生自同一类-
Microsoft.AspNetCore.Mvc.Controller
@CodeFuller我明白这一点,但我已将控制器分为两个单独的文件夹和名称空间。我想应该有一种方法可以像旧的MVC和WebApi那样分离过滤器。这种方法可以用于TypeFilterAttributes和iSyncationFilters吗?这种方法可以用于任何过滤器。您只需要稍微调整要使用的过滤器的代码。这种方法将为每个请求使用相同的过滤器实例!要非常小心