【问题标题】:HTTP module vs action filter in asp.net-mvcasp.net-mvc 中的 HTTP 模块与操作过滤器
【发布时间】:2012-07-16 15:29:09
【问题描述】:

我正在用 asp.net MVC3 开发一个应用程序,我有以下问题: 什么时候应该写一个 HTTP 模块,什么时候应该写一个动作过滤器?

【问题讨论】:

    标签: asp.net-mvc httpmodule action-filter


    【解决方案1】:
    1. Filter 是更多的 MVC 做事方法,而 Http Module 更多是 ASP.NET 做事的方法。两者都通过在处理管道中提供挂钩来达到类似的目的。

    2. HttpModule 更通用,当您希望在每个请求上处理某些内容时。过滤器对于添加特定于操作的行为很有用。

    3. 如果您希望某个内容在每个 Http 请求中只执行一次,您应该使用 HttpModule。 ActionFilter 可能会在请求期间执行多次,除非您检查 IsChildActionOn。

    【讨论】:

      【解决方案2】:

      HttpModule 在请求处理程序执行之前和之后调用。它们旨在使开发人员能够拦截、参与或修改每个请求。可以订阅 22 个可用事件,使模块能够在流程的各个阶段处理请求。这些事件对于希望在引发关键请求管道事件时运行代码的页面开发人员很有用。如果您正在开发自定义模块并且希望针对管道的所有请求调用该模块,它们也很有用。

      过滤器旨在在 MVC 请求生命周期之间注入逻辑。特别是在调用 de 动作之前和之后,以及在处理结果之前和之后。过滤器为用户提供了强大的方法来检查、分析、捕获和检测 MVC 项目中发生的一些事情。从 MVC5 开始,共有 5 种过滤器:

      • 身份验证
      • 授权
      • 动作
      • 结果
      • 异常

      因此,如果您想拦截、参与或修改特定的22 events in the http request pipeline,请选择模块。如果您的逻辑与操作方法严格相关,则最好在服务器上覆盖以下 ActionFilterAttribute 方法之一:

      • OnActionExecuting
      • OnActionExecutted
      • OnResultExecuting
      • OnResultExecuted

      【讨论】:

      • 我知道 OP 没有询问“全局操作过滤器”(我们在启动期间插入服务器范围的配置文件的过滤器)。您是否仍然愿意就何时使用全局操作过滤器做出明确的“荣誉提及”?在处理源自 db 层的异常时,我一直认为我可以通过全局操作过滤器很好地修改 http 响应。是否建议为此类事情使用 http 模块?提前谢谢你。
      【解决方案3】:

      HttpModule 是 IIS 允许 Web 应用程序通过让您将事件处理程序附加到 HttpApplication 事件来覆盖默认行为或添加自定义逻辑的方式。 不同的 IIS 模式(集成或经典)甚至使用有不同的 Web.config 设置。
      参考:
      http://msdn.microsoft.com/en-us/library/ms227673(v=vs.100).aspx

      示例:将非 www 重定向到 www 网址

      public void Init(HttpApplication application)
      {
          application.PreRequestHandlerExecute += this.Application_PreRequestHandlerExecute;
      }
      
      private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
      {
          Uri requestUrl = HttpContext.Current.Request.Url;
          string host = requestUrl.Authority.ToLower();
          if (!host.StartsWith("www"))
          {
              HttpContext.Current.Response.Redirect(requestUrl.Scheme + "://www." + host + requestUrl.PathAndQuery);
              HttpContext.Current.Response.End();
          }
      }
      

      Action Filter 是一个装饰控制器或操作方法的属性。它是 MVC 路由和操作方法之间的抽象层。使用动作过滤器,我们可以将相同的逻辑应用于多个控制器或动作方法。例如,自定义日志记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多