ASP.Net MVC中的HTTP模块和HTTP处理程序?

时间:2016-11-04 13:57:18

标签: asp.net asp.net-mvc httphandler httpmodule

我在面试中被问到如何在 require('jit-grunt')(grunt, { express: 'grunt-express-server', useminPrepare: 'grunt-usemin', ngtemplates: 'grunt-angular-templates', cdnify: 'grunt-google-cdn', protractor: 'grunt-protractor-runner', buildcontrol: 'grunt-build-control', istanbul_check_coverage: 'grunt-mocha-istanbul', ngconstant: 'grunt-ng-constant' }); 中实施HTTP moduleHTTP handler。我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑。但是在ASP.Net MVC中我们有过滤器,所以我告诉他们我们使用过滤器。我给出了正确的答案吗?

1 个答案:

答案 0 :(得分:18)

操作过滤器 允许您仅挂载 MVC特定事件,而 HTTP模块 < / strong>允许您挂钩 ASP.Net事件。因此,即使在MVC中,要实现HTTP模块和HTTP处理程序,您还需要实现相应的接口。

  • 如果您希望每个Http请求只执行一次您的功能,则应使用HttpModule。
  • 可以在一次访问服务器的过程中多次执行ActionFilters。

为了解释HTTP模块和HTTP处理程序,MVC使用HTTP模块和HTTP处理程序在请求链中注入预处理逻辑。

  • HTTP处理程序是基于扩展的预处理器,而HTTP模块是基于事件的预处理程序。
    • 例如:如果要更改jpg文件的处理方式,您将实现自定义HTTP处理程序,而不是在处理请求期间执行其他逻辑时,您将实现自定义HTTP模块。对于特定请求,始终只有一个HTTP处理程序,但可以有多个HTTP模块。

实施HTTP处理程序:

您实施IHttpHandler类并实施ProcessRequest方法和IsResuable属性。 IsResuable属性确定是否可以重用处理程序。

public class MyJpgHandler: IHttpHandler 
{

    public bool IsReusable => false;

    public void ProcessRequest(HttpContext context) 
    {
       // Do something
    }
}

接下来,我们需要指定web.config文件中的自定义处理程序将处理哪种请求:

<httpHandlers>
    <add verb="*" path="*.jpg" type="MyJpgHandler"/>
</httpHandlers>

实施HTTP模块:

我们需要实现IHttpModule并在Init方法中注册所需的事件。举个简单的例子,如果我们想记录所有请求:

public class MyHttpModule: IHttpModule 
{

    public MyHttpModule() {}

    public void Init(HttpApplication application) 
    {
        application.BeginRequest += new EventHandler(this.context_BeginRequest);
        application.EndRequest += new EventHandler(this.context_EndRequest);
    }

    public void context_BeginRequest(object sender, EventArgs e) 
    {
        StreamWriter sw = new StreamWriter(@ "C:\log.txt", true);
        sw.WriteLine("Request began at " + DateTime.Now.ToString());
        sw.Close();
    }

    public void context_EndRequest(object sender, EventArgs e) 
    {
        StreamWriter sw = new StreamWriter(@ "C:\log.txt", true);
        sw.WriteLine("Request Ended at " + DateTime.Now.ToString());
        sw.Close();
    }

    public void Dispose() {}
}

web.config文件中注册我们的模块:

<httpModules>
    <add name="MyHttpModule " type="MyHttpModule " />
</httpModules>