• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

《professional asp.net 2.0》读书笔记--连载2

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1.1         通过《深入了解asp.net架构》来学习

本视频主要包括以下几个方面的内容:

l         Asp.net请求的处理过程;

l         httpModule

l         HttpHandler

l         HttpModle and HttpHandler 的使用实例;

l         Asp.net 的事件模型机制;

1.1.1          Asp.net 的工作原理

Aspx页面的的一般处理过程如下图所示:


1.1.2          Asp.net 的页面处理过程:

下面通过一个更加详细的图形来描述aspnet_isapi.dll处理页面的一个流程:

 

请求的处理过程是基于管道模型的。

我们通过下图来理解什么管道模型:

其实就是可以有多个HttpModule,但是只能有一个HttpHandler

1.1.3          Isapi筛选器

Iis默认不会处理动态页面,只能处理html页面,于是就需要对iis进行扩展,这些扩展要注册到iis中,和特定的后缀名绑定,这样以后每当iis遇到了某个后缀名,就把他发送给响应的扩展来处理,这些筛选器处理完之后,把结果返回给iisiis就把这个结果返回给客户。比如对于asp,就要用asp_isapi.dll来处理,对于asp.net就要使用aspnet_isapi.dll来处理。扩展的方法有两种:ISAPI Filter ISAPI Extension两种。其中HttpModule就是筛选器;HttpHandler就是Http Extension

1.1.4          HttpModule

Httpmodule实现了过滤器也就是筛选器的功能;HttpModule 实现了System.Web.IHttpModule的接口。

(1)       实现步骤

l         编写一个类,实现IHttpModule接口;

l         实现init方法,注册需要的方法;

l         实现注册的方法;

l         实现dispose方法,这是在为类实现一些清除工作的时候才实现的,通常情况下可以什么都不作,为空;

l         web.config是注册该HttpModule类。

2)可以被处理的事件

其实所谓添加HttpModule,就是给HttpApplication的一些列时间添加事件处理函数,在HttpModule类中给需要添加处理函数的事件添加处理函数即可。

HttpApplication主要有以下一些事件:

l         BeginRequest

l         AuthenticateRequest

l         AuthorizeRequest

l         ResolveRequestCache

l         AcquireRequestState

l         PreRequestHandlerExecute

l         PostRequestHandlerExecute

l         ReleaseRequestState

l         UpdateRequestCache

l         EndRequest

所有的这些事件都能够被重新定义,但是不是override;你要明白,也就是增加了一层Module,原来的HttpModule仍然存在。这就是HttpModule的基本工作原理。

3)一个例子

下面给出一个如何自定义HttpModule的例子。

该HttpModule名为:MyHttpModule其中有一个AcquireRequestState事件的处理函数,整个类的定义如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

/// <summary>

/// Summary description for MyHttpModule

/// </summary>

public class MyHttpModule: System.Web.IHttpModule

{

    public MyHttpModule()

    {

       //

       // TODO: Add constructor logic here

       //

    }

    public void Init(HttpApplication httpA)

 {

    // Application 对象注册事件处理程序

     httpA.AuthenticateRequest += new EventHandler(this.AuthenticateRequest);

 }

 

 public void Dispose()

 {

  

 }

 

 private void AuthenticateRequest(object r_objSender,EventArgs r_objEventArgs)

    {

       HttpApplication httpA = (HttpApplication)r_objSender;

       httpA.Context.Response.Write("in MyHttpModule AuthenticateRequest Event Handler");

 

    }

}

 

把该类放在solution下的叫做App_Code文件夹下,然后在web.config中添加如下代码:

<system.web>

    <httpModules>

       <add name="Test1" type="MyHttpModule,App_Code"/>

    </httpModules>

   

</system.web>

 

然后给solution添加一个空白页面,运行该页面,得到的结果如下:

4)这些事件的执行顺序如何?

如果想要弄清HttpApplication的所有这些事件的执行顺序如何,那么通过下面的这个例子就明白了。

我们对上面的例子作一个简单的修改,代码如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

/// <summary>

/// Summary description for MyHttpModuleMultiEvent

/// </summary>

public class MyHttpModuleMultiEvent : System.Web.IHttpModule

{

    public MyHttpModuleMultiEvent()

    {

       //

       // TODO: Add constructor logic here

       //

    }

    public void Init(HttpApplication httpA)

    {

       // Application 对象注册事件处理程序

       httpA.BeginRequest += new EventHandler(this.BeginRequest);

       httpA.AuthenticateRequest += new EventHandler(this.AuthenticateRequest);

       httpA.AuthorizeRequest += new EventHandler(this.AuthorizeRequest);

       httpA.ResolveRequestCache += new EventHandler(this.ResolveRequestCache);

       httpA.AcquireRequestState += new EventHandler(this.AcquireRequestState);

       httpA.PreRequestHandlerExecute += new EventHandler(this.PreRequestHandlerExecute);

       httpA.PostRequestHandlerExecute += new EventHandler(this.PostRequestHandlerExecute);

       httpA.ReleaseRequestState += new EventHandler(this.ReleaseRequestState);

       httpA.UpdateRequestCache += new EventHandler(this.UpdateRequestCache);

       httpA.EndRequest += new EventHandler(this.EndRequest);


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap