7

我需要为进入我的应用程序的每个请求检查一些东西(Cookie)。

在 ASP.NET 中,我们使用 HttpModule 来完成这项任务,问题应该在 MVC 中使用什么?一些 Global Filter ,或者我也可以使用 HttpModuler , MVC 和常规 ASP.NET 之间的 Request PipeLine 有什么区别吗?

4

3 回答 3

12

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

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

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

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

所以这真的取决于你什么时候需要挂钩你的事件以及你需要哪些事件。

于 2012-11-25T11:24:36.950 回答
4

如果 HttpModule 之前为您工作得很好,那么它将继续使用 Mvc。

您问题的其他部分范围很广,并且认为您也可以阅读一篇关于asp.net-mvc 管道和可扩展性的好文章。

于 2012-11-25T11:20:55.597 回答
2

我使用全局操作过滤器做了类似的事情。它工作得很好,并使您的代码集成在您的应用程序中。

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

于 2012-11-25T11:31:32.587 回答