ASPNET MVC过滤器,WebAPI过滤器,ASPNET核心MVC过滤器是三个不同的东西吗?

时间:2019-04-13 04:46:44

标签: asp.net-core

ASP.NET中的过滤器使我感到困惑。我看过3种过滤器:

MVC过滤器System.Web.Mvc.IAction​Filter

WebAPI过滤器System.Web.Http.Filters.IActionFilter

核心MVC过滤器Microsoft.AspNetCore.Mvc.Filters.IActionFilter

是否有Core WebAPI过滤器?

我有一个WebAPI过滤器,该过滤器通过构造函数参数使用依赖注入。在使用Unity作为IOC容器的WebAPI应用程序中,它运行良好。

container.Register<IMyService, MyService>();
container.Register<LogActionFilter>();

var filterInstance = container.Resolve<LogActionFilter>();
GlobalConfiguration.Configuration.Filters.Add(filterInstance);

以下属性Log被定义为仅具有三个属性的简单属性。上面的LogActionFilter将使用Log检查动作是否具有GetCustomeAttribute<LogAttribute>()属性。

[Log(Enabled=true, Level=2, Format="xxxx")]
public void MyAction()
{
}

现在,我想将其迁移到ASP.NET CORE。我可以将DI用于CORE过滤器吗?

我只能在ASPNET CORE中找到Microsoft.AspNetCore.Mvc.Filters.IActionFilter。而且似乎很难使用DI。仍然不知道如何注册这样的过滤器。

我知道有ServiceFilter(typeof(XxxFilter)),但是传递像[Log(Enabled=true, Level=2, Format="xxxx")]这样的参数是不好的

有人有CORE过滤器的例子吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

TL; DR:它们几乎都是同一件事。

因此,共同的主题是它们都是MVC动作过滤器。这意味着它们在MVC框架的上下文中四处执行动作。

区别仅在于它们用于不同 MVC框架。

ASP.NET MVC是在.NET Framework上运行的较旧的MVC框架。 WebAPI是专门为创建Web API而开发的框架。它通常类似于ASP.NET MVC,但仍然是一个单独的实体。

使用ASP.NET Core(Microsoft最新和最新的开源MVC框架),已消除了“ MVC”和“ WebAPI”之间的区别,而您仅在ASP.NET Core中包含了一个MVC框架。因此,您只有ASP.NET Core,并且碰巧在MVC操作周围使用了操作过滤器。

ASP.NET Core有非常好的documentation on MVC filters。还有一个专门针对dependency injection in filters的部分。您可以使用ServiceFilterTypeFilter在过滤器中正确使用依赖项注入。当您想从DI容器中完全解析过滤器时,可以使用ServiceFilter,而可以使用TypeFilter在属性中直接提供一些参数。具有讽刺意味的是,example on TypeFilter还使用了一个日志记录示例。

话虽这么说,日志记录通常不是动作过滤器的最佳用例,因为默认情况下ASP.NET Core实际上会记录动作的执行情况。