【问题标题】:MVC 3/4 HttpModule or ActionFilterMVC 3/4 HttpModule 或 ActionFilter
【发布时间】:2012-11-25 11:08:01
【问题描述】:
我需要为每个进入我的应用程序的请求检查一些东西(Cookie)。
在 ASP.NET 中,我们使用 HttpModule 来完成这项任务,问题应该在 MVC 中使用什么?一些 Global Filter ,或者我也可以使用 HttpModuler , MVC 和常规 ASP.NET 之间的 Request PipeLine 有什么区别吗?
【问题讨论】:
标签:
asp.net
asp.net-mvc
asp.net-mvc-3
asp.net-mvc-4
httpmodule
【解决方案1】:
MVC 是对 ASP.NET 的抽象,因此它们的“钩子”实际上取决于您要在哪个级别注入逻辑。动作过滤器将允许您挂钩 MVC 特定事件:
-
OnActionExecuting – 在执行控制器操作之前调用此方法。
-
OnActionExecuted – 在执行控制器操作后调用此方法。
-
OnResultExecuting – 在执行控制器操作结果之前调用此方法。
-
OnResultExecuted – 在执行控制器操作结果后调用此方法。
而 HttpModule 仅允许您连接到 ASP.NET(在其上构建 MVC)特定事件:
-
BeginRequest - 请求已开始。如果您需要在请求开始时执行某些操作(例如,在每个页面顶部显示广告横幅),请同步此事件。
-
AuthenticateRequest - 如果您想插入自己的自定义身份验证方案(例如,根据数据库查找用户以验证密码),请构建一个同步此事件并以您想要的方式对用户进行身份验证的模块.
-
AuthorizeRequest - 此事件在内部用于实现授权机制(例如,将访问控制列表 (ACL) 存储在数据库中而不是文件系统中)。尽管您可以覆盖此事件,但这样做的充分理由并不多。
-
PreRequestHandlerExecute - 此事件在 HTTP 处理程序执行之前发生。
-
PostRequestHandlerExecute - 此事件在 HTTP 处理程序执行后发生。
-
EndRequest - 请求已完成。您可能希望构建一个调试模块,用于在整个请求中收集信息,然后将信息写入页面。
所以这真的取决于你什么时候需要挂钩你的事件以及你需要哪些事件。
【解决方案3】:
我使用全局操作过滤器做了类似的事情。它工作得很好,并使您的代码集成在您的应用程序中。
当然,HTTP 模块也可以工作,但这意味着将代码与主应用程序分开并单独维护它。除非您的代码跨越多个站点或用于多个应用程序,或者需要与 Web 表单站点一起使用,否则我会使用全局过滤器。