Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net-mvc中的HTTP模块与操作筛选器_Asp.net Mvc_Httpmodule_Action Filter - Fatal编程技术网

asp.net-mvc中的HTTP模块与操作筛选器

asp.net-mvc中的HTTP模块与操作筛选器,asp.net-mvc,httpmodule,action-filter,Asp.net Mvc,Httpmodule,Action Filter,我正在asp.net MVC3中开发一个应用程序,我有以下问题: 我应该什么时候写HTTP模块,什么时候写动作过滤器 过滤器更多的是MVC方式,而Http模块更多的是ASP.NET方式。两者的作用相似,都是在加工管线上提供挂钩 HttpModule更通用,当您希望在每个请求上处理某些事情时。过滤器对于添加特定于操作的行为非常有用 如果希望某件事情在每个Http请求中只执行一次,那么应该使用HttpModule。ActionFilter可能在请求期间执行多次,直到和除非您选中IsChildActi

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

  • 过滤器更多的是MVC方式,而Http模块更多的是ASP.NET方式。两者的作用相似,都是在加工管线上提供挂钩

  • HttpModule更通用,当您希望在每个请求上处理某些事情时。过滤器对于添加特定于操作的行为非常有用

  • 如果希望某件事情在每个Http请求中只执行一次,那么应该使用HttpModule。ActionFilter可能在请求期间执行多次,直到和除非您选中IsChildActionOn

  • HttpModule是IIS允许Web应用程序通过将事件处理程序附加到HttpApplication事件来覆盖默认行为或添加自定义逻辑的方式。 不同的IIS模式(集成或经典)甚至使用不同的Web.config设置。
    参考:

    示例:将非www重定向到www URL

    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();
        }
    }
    

    动作过滤器是修饰控制器或动作方法的属性。它是MVC路由和操作方法之间的抽象层。使用动作过滤器,我们可以将相同的逻辑应用于多个控制器或动作方法。例如,在请求处理程序执行前后调用自定义日志记录。

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

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

    • 认证
    • 授权书
    • 行动
    • 结果
    • 例外情况
    因此,如果您想拦截、参与或修改特定的模块,请选择模块。如果您的逻辑与action方法严格相关,则最好让服务器重写以下ActionFilterAttribute方法之一:

    • OnActionExecuting
    • OnActionExecuted
    • OnResultExecuting
    • OnResultExecuted

    我知道OP没有询问“全局操作过滤器”(我们在启动时插入服务器范围的配置文件的过滤器)。您是否仍愿意就何时使用全局动作过滤器做出明确的“光荣推荐”?我一直认为,在处理来自db层的异常时,我可以通过全局操作过滤器很好地修改http响应。对于这类事情,建议使用http模块吗?先谢谢你。