roh*_*ngh 18 asp.net asp.net-mvc httphandler httpmodule
我在面试中被问到如何实施HTTP module
和HTTP handler
进行的问题ASP.Net MVC
.我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑.但是在ASP.Net MVC中我们有过滤器,所以我告诉他们我们使用过滤器.我给出了正确的答案吗?
小智 24
Action Filters允许您仅挂钩到 MVC特定事件,而 HTTP模块允许您挂钩到 ASP.Net事件.因此,即使在MVC中,要实现HTTP模块和HTTP处理程序,您还需要实现相应的接口.
为了解释HTTP模块和HTTP处理程序,MVC使用HTTP模块和HTTP处理程序在请求链中注入预处理逻辑.
jpg
文件的处理方式,则需要实现自定义HTTP处理程序,而如果要在处理请求期间执行其他逻辑,则需要实现自定义HTTP模块.对于特定请求,始终只有一个HTTP处理程序,但可以有多个HTTP模块.要实现HTTP处理程序:
您实现了IHttpHandler
类和实现ProcessRequest
方法和IsResuable
属性.IsResuable
property确定是否可以重用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模块:
我们需要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() {}
}
Run Code Online (Sandbox Code Playgroud)
并在web.config
文件中注册我们的模块:
<httpModules>
<add name="MyHttpModule " type="MyHttpModule " />
</httpModules>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18993 次 |
最近记录: |