我在面试中被问到如何在 require('jit-grunt')(grunt, {
express: 'grunt-express-server',
useminPrepare: 'grunt-usemin',
ngtemplates: 'grunt-angular-templates',
cdnify: 'grunt-google-cdn',
protractor: 'grunt-protractor-runner',
buildcontrol: 'grunt-build-control',
istanbul_check_coverage: 'grunt-mocha-istanbul',
ngconstant: 'grunt-ng-constant'
});
中实施HTTP module
和HTTP handler
。我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑。但是在ASP.Net MVC中我们有过滤器,所以我告诉他们我们使用过滤器。我给出了正确的答案吗?
答案 0 :(得分:18)
操作过滤器 允许您仅挂载 MVC特定事件,而 HTTP模块 < / strong>允许您挂钩 ASP.Net事件。因此,即使在MVC中,要实现HTTP模块和HTTP处理程序,您还需要实现相应的接口。
为了解释HTTP模块和HTTP处理程序,MVC使用HTTP模块和HTTP处理程序在请求链中注入预处理逻辑。
jpg
文件的处理方式,您将实现自定义HTTP处理程序,而不是在处理请求期间执行其他逻辑时,您将实现自定义HTTP模块。对于特定请求,始终只有一个HTTP处理程序,但可以有多个HTTP模块。实施HTTP处理程序:
您实施IHttpHandler
类并实施ProcessRequest
方法和IsResuable
属性。 IsResuable
属性确定是否可以重用处理程序。
public class MyJpgHandler: IHttpHandler
{
public bool IsReusable => false;
public void ProcessRequest(HttpContext context)
{
// Do something
}
}
接下来,我们需要指定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() {}
}
在web.config
文件中注册我们的模块:
<httpModules>
<add name="MyHttpModule " type="MyHttpModule " />
</httpModules>