2016-11-04 71 views
6

我在采访中被问到如何在ASP.Net MVC中实现HTTP moduleHTTP handler。我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑。但在ASP.Net MVC我们有过滤器,所以我告诉他们我们使用过滤器。我给出了正确的答案吗?ASP.Net MVC中的HTTP模块和HTTP处理程序?

+0

过滤器只能调用由控制器处理的请求。更一般的,你将不得不使用IHttpHandler和IHttpModule ...除非你在OWIN中,在这种情况下它将是一个OWIN中间件类。 – Dai

+0

我没有把你带到这里。我不确定OWIN –

回答

5

动作过滤器仅允许您挂接到MVC特定事件,而HTTP模块允许您挂接到ASP.Net事件,因此即使在MVC中,要实现HTTP模块和HTTP处理程序,您也需要实现相应的界面。 另外,如果你希望你的功能只在每个Http Request中执行一次,你应该使用HttpModule。 ActionFilters可以在一次访问服务器的过程中执行多次。 为了解释HTTP模块和HTTP处理程序,MVC使用HTTP模块和HTTP处理程序在请求链中注入预处理逻辑。

HTTP处理程序是基于扩展的预处理程序,而HTTP模块是基于事件的预处理程序。例如,如果你想改变jpg文件的处理方式,你将实现自定义的HTTP处理程序,而如果你想在处理请求期间执行额外的逻辑,你将实现一个自定义的HTTP模块。对于特定的请求总是只有一个HTTP处理程序,但可以有多个HTTP模块。

要实施HTTP处理程序,请执行IHTTPHandler类并实施方法ProcessRequest和属性IsResuableIsResuable属性确定处理程序是否可以重用。

public class MyJpgHandler: IHttpHandler { 
    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
    public void ProcessRequest(HttpContext context) { 
    } 
} 

接下来我们需要指定哪一种请求将由我们的自定义处理程序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() {} 
} 

并注册我们的模块:

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