上周一个同事去面试, 回来他回问我这样一道题目:asp.net里面,如果有很多页面都有重复的动作(比如页面加载的时候进行用户验证啥的),你怎么简化?
1.基类法
当时只想到了写一个页面基类BasePage继承自Page类,然后所有这些页面都再从BasePage类继承,而不是直接从Page继承,这样再把所有的这些重复动作的代码都写在这个BasePage类中,这样就应该能达到了简化的作用。示例代码如下:
{
// 可以override相应的事件,执行这些重复的操作
protected override void OnPreInit(EventArgs e)
{
base .OnPreInit(e);
}
}
// 实际使用的类,继承BasePage而不是直接继承Page
public partial class NewPage: BasePage
{
// ....
}
2.HttpModule
同事说他也是这么说的,但是他说这个答案面试官并不是太满意,于是我突然想到,应该可以用HttpModule来实现。但是我对HttpModule实在不太熟悉,于是上网查阅了一下相关的资料,才明白了HttpModule的具体用法。
ASP.NET对请求处理的过程:
当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完 毕将结果返回客户端。
inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。
ASPNET_ISAPI.DLL:是处理.aspx文件的win32组件。其实IIS服务器是只能识别.html文件的,当IIS服务器发现被请求的文件是.aspx文件时,IIS服务器将其交给aspnet_isapi.dll来处理。
aspnet_wp.exe进程:ASP.NET框架进程,提供.net运行的托管环境,.net的CLR(公共语言运行时)就是寄存在此进程中。
ASP.NET Framework处理一个Http Request的流程:
HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET 把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给 客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。
注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。
当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其 它信息,或者截获的这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中 把请求处理的结果进行再次加工返回客户端。
- HttpModule与HttpHandler详解 (上面这段话摘自这篇文章)
- HTTP Handlers and HTTP Modules Overview
- Walkthrough: Creating and Registering a Custom HTTP Module
然后由HttpModule又看到了HttpHandler的相关用法。在看MSDN的过程中,意识到这些事件的处理和Application和页面的生命周期息息相关。因而又学习了这二个方面相关的东西。详情参见这二个链接:
3. 不成熟的想法AOP
后来想想这个方法貌似不太对,不知道还有没有更好的办法。
第一篇和技术有关系的博文。穿插大量链接,权当学习的记录,以后备查吧。