我在采访中被问到如何在ASP.Net MVC
中实现HTTP module
和HTTP handler
。我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑。但在ASP.Net MVC我们有过滤器,所以我告诉他们我们使用过滤器。我给出了正确的答案吗?ASP.Net MVC中的HTTP模块和HTTP处理程序?
6
A
回答
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
和属性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>
相关问题
- 1. HTTP模块和HTTP处理程序
- 2. http处理程序和模块WCF
- 3. http处理程序和asp.net mvc
- 4. ASP.Net中的通用HTTP处理程序
- 5. 使用http模块或http处理程序拦截C#中的文件下载?
- 6. c#和HTTP处理程序
- 7. 404在Asp.Net MVC(RC 5)中的HTTP错误处理程序
- 8. Spring MVC - 通用HTTP处理程序
- 9. ASP.NET Http模块序列 - 线程问题
- 10. 在asp.net中处理.csv文件的异步http处理程序
- 11. HTTP处理程序问题
- 12. 调试HTTP处理程序
- 13. 自定义错误处理http模块
- 14. 的Http处理程序加载错误
- 15. 使用UI路由器和MVC访问HTTP处理程序5
- 16. 转移sitemap.xml HTTP请求到ASP.NET MVC中的路由处理程序
- 17. ASP.NET HTTP处理程序和全局变量
- 18. 自定义Http处理程序IIS7和ASP.NET
- 19. asp.net ajax + http模块失败
- 20. Httphandlers和http模块
- 21. MonoDevelop:无法加载http处理程序
- 22. ASP.NET MVC 2和自定义HTTP模块优先
- 23. 未在Mono MVC 3下正确注册的HTTP处理程序
- 24. ASP.NET MVC:从http
- 25. HTTP ::代理模块引擎
- 26. ashx错误http处理程序
- 27. 在web.config中注册ASP.NET Http处理程序有多种方法?
- 28. 在ASP.NET应用程序中处理大型并发HTTP POST
- 29. HTTP处理程序压缩过的iis
- 30. 在F#中实现异步http处理程序的模式?
过滤器只能调用由控制器处理的请求。更一般的,你将不得不使用IHttpHandler和IHttpModule ...除非你在OWIN中,在这种情况下它将是一个OWIN中间件类。 – Dai
我没有把你带到这里。我不确定OWIN –