MVC 3/4 HttpModule或ActionFilter

时间:2012-11-25 11:08:01

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 httpmodule

我需要检查来自我的应用程序的每个请求的一些内容(Cookies)。

在ASP.NET中我们使用HttpModule来完成这项任务,这个问题应该在MVC中使用什么?一些全局过滤器,或者我也可以使用HttpModuler,在MVC和常规ASP.NET之间的Request PipeLine有什么不同吗?

3 个答案:

答案 0 :(得分:11)

MVC是对ASP.NET的抽象,因此它们的“钩子”实际上取决于您想要注入逻辑的级别。动作过滤器将允许您挂钩MVC特定事件:

  • OnActionExecuting - 在执行控制器操作之前调用此方法。
  • OnActionExecuted - 执行控制器操作后调用此方法。
  • OnResultExecuting - 在执行控制器操作结果之前调用此方法。
  • OnResultExecuted - 执行控制器操作结果后调用此方法。

而HttpModule只允许您挂钩到ASP.NET(构建MVC)特定事件:

  • BeginRequest - 请求已经开始。如果您需要在请求开始时执行某些操作(例如,在每个页面顶部显示广告横幅),请同步此事件。
  • AuthenticateRequest - 如果要插入自己的自定义身份验证方案(例如,针对数据库查找用户以验证密码),请构建一个同步此事件并对用户进行身份验证的模块。你想要的方式。
  • AuthorizeRequest - 此事件在内部用于实现授权机制(例如,将访问控制列表(ACL)存储在数据库中而不是文件系统中)。虽然您可以覆盖此事件,但没有太多合理的理由。
  • PreRequestHandlerExecute - 此事件在HTTP处理程序执行之前发生。
  • PostRequestHandlerExecute - 此事件在HTTP处理程序执行后发生。
  • EndRequest - 请求已完成。您可能希望构建一个调试模块,该模块在整个请求中收集信息,然后将信息写入页面。

所以这真的取决于你何时需要挂钩你的活动以及你需要哪些活动。

答案 1 :(得分:3)

如果HttpModule在此之前效果很好,那么它将继续使用Mvc。

你问题的其他部分范围很广,并且认为你也可以在asp.net-mvc pipeline and extensibilit y阅读一篇好文章。

答案 2 :(得分:2)

我使用全局动作过滤器做了类似的事情。它运行良好,并将您的代码集成到您的应用程序中。

当然,HTTP模块也可以正常工作,但这意味着要从主应用程序中分离代码并单独维护它。除非您的代码跨越多个站点或用于多个应用程序,或者需要使用Web表单站点,否则我将使用全局过滤器。