ASP.Net MVC中的HTTP模块和HTTP处理程序?
我在采访中被问到如何在ASP.Net MVC
中实现HTTP module
和HTTP handler
。我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑。但在ASP.Net MVC我们有过滤器,所以我告诉他们我们使用过滤器。我给出了正确的答案吗?ASP.Net MVC中的HTTP模块和HTTP处理程序?
动作过滤器仅允许您挂接到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
和属性IsResuable
。 IsResuable
属性确定处理程序是否可以重用。
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>
过滤器只能调用由控制器处理的请求。更一般的,你将不得不使用IHttpHandler和IHttpModule ...除非你在OWIN中,在这种情况下它将是一个OWIN中间件类。 – Dai
我没有把你带到这里。我不确定OWIN –