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

roh*_*ngh 18 asp.net asp.net-mvc httphandler httpmodule

我在面试中被问到如何实施HTTP moduleHTTP handler进行的问题ASP.Net MVC.我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑.但是在ASP.Net MVC中我们有过滤器,所以我告诉他们我们使用过滤器.我给出了正确的答案吗?

小智 24

Action Filters允许您挂钩到 MVC特定事件,而 HTTP模块允许您挂钩到 ASP.Net事件.因此,即使在MVC中,要实现HTTP模块和HTTP处理程序,您还需要实现相应的接口.

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

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

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

要实现HTTP处理程序:

您实现了IHttpHandler类和实现ProcessRequest方法和IsResuable属性.IsResuableproperty确定是否可以重用handler.

public class MyJpgHandler: IHttpHandler 
{

    public bool IsReusable => false;

    public void ProcessRequest(HttpContext context) 
    {
       // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<httpHandlers>
    <add verb="*" path="*.jpg" type="MyJpgHandler"/>
</httpHandlers>
Run Code Online (Sandbox Code Playgroud)

要实现HTTP模块:

我们需要IHttpModuleInit方法中实现和注册所需的事件.举个简单的例子,如果我们想记录所有请求:

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() {}
}
Run Code Online (Sandbox Code Playgroud)

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

<httpModules>
    <add name="MyHttpModule " type="MyHttpModule " />
</httpModules>
Run Code Online (Sandbox Code Playgroud)