我在采访中被问到如何在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. HTTP处理程序vs HTTP模块
- 5. asp.net HTTP处理程序
- 6. http处理程序asp.net
- 7. ASP.Net中的通用HTTP处理程序
- 8. 使用http模块或http处理程序拦截C#中的文件下载?
- 9. c#和HTTP处理程序
- 10. 404在Asp.Net MVC(RC 5)中的HTTP错误处理程序
- 11. Asp.net自定义http处理程序之前另一个ashx http处理程序
- 12. Spring MVC - 通用HTTP处理程序
- 13. ASP.NET Http模块序列 - 线程问题
- 14. 在asp.net中处理.csv文件的异步http处理程序
- 15. Global.asax或http处理程序
- 16. asp.net http处理程序和http模块在没有使用IIS的情况下工作吗?
- 17. 处理来自GWT模块的http cookie
- 18. HTTP处理程序问题
- 19. 调试HTTP处理程序
- 20. HTTP处理程序问题
- 21. 创建HTTP处理程序
- 22. 在asp.net应用程序中不运行http处理程序
- 23. HTTP处理程序来处理.zips
- 24. 自定义错误处理http模块
- 25. 的Http处理程序加载错误
- 26. MVC路由和HTTP模块的执行顺序
- 27. 使用UI路由器和MVC访问HTTP处理程序5
- 28. 转移sitemap.xml HTTP请求到ASP.NET MVC中的路由处理程序
- 29. ASP.NET HTTP处理程序和全局变量
- 30. 自定义Http处理程序IIS7和ASP.NET
过滤器只能调用由控制器处理的请求。更一般的,你将不得不使用IHttpHandler和IHttpModule ...除非你在OWIN中,在这种情况下它将是一个OWIN中间件类。 – Dai
我没有把你带到这里。我不确定OWIN –