`
pcajax
  • 浏览: 2158878 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入了解ASP.NET运行内幕

阅读更多

做事情要知道根本所在,原理所在,写程序更应该知道程序的运行机制,本文主要介绍 asp.net的运行内幕
HttpApplication触发事件来通知你的程序有事发生,以此来负责请求流转.这作为HttpApplication.Init()函数的一部分发生(用Reflector查看System.Web.HttpApplication.InitInternal()方法和HttpApplication.ResumeSteps()方法来了解更多详情),连续设置并启动一系列事件,包括执行所有的处理器(handler).这些事件处理器映射到global.asax中自动生成的哪些事件中,同时它们也映射到所有附加的HttpModule(它们本质上是HttpApplication对外发布的额外的事件接收器(sink)).

HttpModule和HttpHandler两者都是根据Web.config中对应的配置被动态载入并附加到事件处理链中.HttpModule实际上是事件处理器,附加到特殊的HttpApplication事件上,然而HttpHandler是用来处理”应用级请求处理”的终点.

HttpModule和HttpHandler两者都是在HttpApplication.Init()函数调用的一部分中被载入并附加到调用链上.图6显示了不同的事件,它们是何时发生的以及它们影响管道的哪一部分.

图6-事件在ASP.NET http管道中流转的过程.HttpApplication对象的事件驱动请求在管道中流转.Http Module可以拦截这些事件并覆盖或者扩展现有的功能.

HttpContext, HttpModules 和 HttpHandlers

<script language="JavaScript" src="http://book.book560.com/ads/ads728x15.js" type="text/javascript"></script>

httpApplication它本身对发送给应用程序的数据一无所知-它只是一个通过事件来通讯的消息对象.它触发事件并通过HttpContext对象来向被调用函数传递消息.实际的当前请求的状态数据由前面提到的HttpContext对象维护.它提供了所有请求专有的数据并从进入管道开始到结束一直跟随请求.图7显示了ASP.NET管道中的流程.注意上下文对象(即HttpContext),这个从请求开始到结束一直都是你”朋友”的对象,可以在一个事件处理函数中保存信息并在以后的事件处理函数中取出.

一旦管道被启动,HttpApplication开始象图六那样一个个的触发事件.每个事件处理器被触发,如果事件被挂接,这些处理器将执行它们自己的任务.这个处理的主要任务是最终调用挂接到此特定请求的HttpHandler.处理器(handler)是ASP.NET请求的核心处理机制,通常也是所有应用程序级别的代码被执行的地方.记住ASP.NET页面和Web服务框架都是作为HttpHandler实现,这里也是处理请求的的核心之处.模块(module)趋向于成为一个传递给处理器(handler)的上下文的预处理或后处理器.ASP.NET中典型的默认处理器包括预处理的认证,缓存以及后处理中各种不同的编码机制.

有很多关于HttpHandler和HttpModule的可用信息,所以为了保持这篇文章在一个合理的长度,我将提供一个关于处理器的概要介绍.

HttpModule

 

当请求在管道中传递时,HttpApplicaion对象中一系列的事件被触发.我们已经看到这些事件在Global.asax中作为事件被发布.这种方法是特定于应用程序的,可能并不总是你想要的.如果你要建立一个通用的可用被插入任何Web应用程序的HttpApplication事件钩子,你可用使用HttpModule,这是可复用的,不需要特定语应用程序代码的,只需要web.config中的一个条目.

模块本质上是过滤器(fliter)-功能上类似于ISAPI过滤器,但是它工作在ASP.NET请求级别上.模块允许为每个通过HttpApplication对象的请求挂接事件.这些模块作为外部程序集中的类存贮.,在web.config文件中被配置,在应用程序启动时被载入.通过实现特定的接口和方法,模块被挂接到HttpApplication事件链上.多个HttpModule可用被挂接在相同的事件上,事件处理的顺序取决于它们在Web.config中声明的顺序.下面是在Web.config中处理器定义.

<configuration>

  <system.web>

    <httpModules>

  <add name= "BasicAuthModule"

      type="HttpHandlers.BasicAuth,WebStore" />

    </httpModules>

  </system.web>

</configuration>

注意你需要指定完整的类型名和不带dll扩展名的程序集名.

模块允许你查看每个收到的Web请求并基于被触发的事件执行一个动作.模块在修改请求和响应数据方面做的非常优秀,可用为特定的程序提供自定义认证或者为发生在ASP.NET中的每个请求增加其他预处理/后处理功能.许多ASP.NET的功能,像认证和会话(Session)引擎都是作为HttpModule来实现的.

虽然HttpModule看上去很像ISAPI过滤器,它们都检查每个通过ASP.NET应用的请求,但是它们只检查映射到单个特定的ASP.NET应用或虚拟目录的请求,也就是只能检查映射到ASP.NET的请求.这样你可以检查所有ASPX页面或者其他任何映射到ASP.NET的扩展名.你不能检查标准的.HTM或者图片文件,除非你显式的映射这些扩展名到ASP.NET ISAPI dll上,就像图1中展示的那样.一个常见的此类应用可能是使用模块来过滤特定目录中的JPG图像内容并在最上层通过GDI+来绘制’样品’字样.

实现一个HTTP模块是非常简单的:你必须实现之包含两个函数(Init()和Dispose())的IHttpModule接口.传进来的事件参数中包含指向HTTPApplication对象的引用,这给了你访问HttpContext对象的能力.在这些方法上你可以挂接到HttpApplication事件上.例如,如果你想挂接AuthenticateRequest事件到一个模块上,你只需像列表5中展示的那样做

列表5:基础的HTTP模块是非常容易实现的

public class BasicAuthCustomModule : IHttpModule

{

<script language="JavaScript" src="http://book.book560.com/ads/ads728x15.js" type="text/javascript"></script>

    public void Init(HttpApplication application)

    {

       // *** Hook up any HttpApplication events

       application.AuthenticateRequest +=

                new EventHandler(this.OnAuthenticateRequest);

    }

    public void Dispose() { }

    public void OnAuthenticateRequest(object source, EventArgs eventArgs)

    {

       HttpApplication app = (HttpApplication) source;

       HttpContext Context = HttpContext.Current;

       … do what you have to do…                        }

}

记住你的模块访问了HttpContext对象,从这里可以访问到其他ASP.NET管道中固有的对象,如请求(Request)和响应(Response),这样你还可以接收用户输入的信息等等.但是记住有些东西可能是不能访问的,它们只有在处理链的后段才能被访问.

你可以在Init()方法中挂接多个事件,这样你可以在一个模块中实现多个不同的功能.然而,将不同的逻辑分到单独的类中可能会更清楚的将模块进行模块化(译注:这里的模块化和前面的模块没有什么关系)在很多情况下你实现的功能可能需要你挂接多个事件-例如一个日志过滤器可能在BeginRequest事件中记录请求开始时间,然后在EndRequest事件中将请求结束写入到日志中.

注意一个HttoModule和HttpApplication事件中的重点:Response.End()或HttpApplication.CompleteRequest()会在HttpApplication和Module的事件链中”抄近道”.看”注意Response.End()”来获得更多信息.

<script language="JavaScript" src="http://book.book560.com/ads/ads728x15.js" type="text/javascript"></script>

注意Response.End()

当创建HttpModule或者在Global.asax中实现事件钩子的时候,当你调用Response.End或 Appplication.CompleteRequest的时候要特别注意.这两个函数都结束当前请求并停止触发在HTTP管道中后续的事件,然后发生将控制返回到Web服务器中.当你在处理链的后面有诸如记录日志或对内容进行操作的行为时,因为他们没有被触发,有可能使你上当.例如,sample中logging的例子就会失败,因为如果调用Response.End()的话,EndRequest事件并不会被触发.

分享到:
评论

相关推荐

    6.ASP.NET技术内幕.pdf

    首先,***使用的是CLR(公共语言运行时)语言,如Visual Basic和C#,编写的代码是编译后的,而不是像以前那样使用解释性的脚本语言,如VBScript。这个特点极大地提升了代码的性能和安全性。其次,***页面是基于...

    asp.net技术内幕源代码

    总之,"ASP.NET技术内幕源代码"是学习和精通ASP.NET的重要资源,特别是对于那些希望深入了解该框架工作原理的开发者来说,它提供了一手的实践材料,可以帮助他们提升开发水平,更好地应对实际项目中的挑战。

    ASP .NET 技术内幕981-end.rar

    《ASP .NET 技术内幕981-end.rar》是一个包含深入探讨ASP .NET技术的压缩文件,其中可能包括书籍的电子版章节、封面和其他相关资料。从文件名来看,我们可以推测这是一份关于ASP .NET的详尽教程或者指南,涵盖了从...

    ASP.NET技术内幕(上)

    2. **.NET Framework**:讲解.NET Framework的基础,包括CLR(Common Language Runtime)和BCL(Base Class Library),这些都是ASP.NET运行的基础。 3. **页面生命周期**:详细阐述ASP.NET页面从请求到响应的完整...

    VisualC#.NET技术内幕

    4. **ASP.NET Web开发**:对于Web应用开发者,书中的内容将深入到ASP.NET,讲解如何构建动态网站,使用控件、页面生命周期、状态管理,以及MVC模式的应用。 5. **ADO.NET数据库访问**:ADO.NET是.NET框架中用于...

    visual basic.net技术内幕

    通过阅读《Visual Basic.NET技术内幕》,读者不仅可以掌握VB.NET的基本用法,还能深入了解其高级特性,提升编程技能,从而在实际项目开发中游刃有余。这本书对于希望在.NET平台上进行软件开发的程序员来说,无疑是一...

    ASP .NET 技术内幕201-270.rar

    在这个"ASP .NET 技术内幕201-270.rar"压缩包中,很可能包含了关于ASP.NET的深入讲解和实践指导,通过pdg格式的文件(可能是电子书的页面),我们可以推测这是一份详细的教程或参考材料。 首先,ASP.NET的核心特性...

    ASP.NET技术内幕(中)

    ASP.NET技术内幕(中)是一本深入探讨ASP.NET框架核心概念和技术的专业书籍,深受IT教师推荐,适合对Web开发有兴趣的读者深入学习。该书详细阐述了.NET Framework下的ASP.NET平台,涵盖了各种关键技术和实践应用。 ...

    Visual Basic.NET技术内幕

    此外,书中很可能还包括了调试技巧、性能优化策略以及与.NET Framework的其他组件(如ASP.NET、WCF、WF)的集成方法。 总之,《Visual Basic.NET技术内幕》是深入学习VB.NET编程的宝贵资源,无论对于初学者还是经验...

    ASP .NET 技术内幕341-420.rar

    《ASP .NET 技术内幕341-420》是一本深入探讨ASP .NET技术的专业书籍,其中涵盖了从341页到420页的重要内容。这本书旨在帮助开发者深入了解ASP .NET的原理、架构以及实际开发中的应用。在压缩包中,我们看到的是一...

    ASP .NET 技术内幕551-620.rar

    10. **调试与性能优化**:了解如何使用Visual Studio进行调试,以及性能分析工具来优化ASP.NET应用的运行效率。 这些章节可能包含了实际的代码示例、问题解决策略以及最佳实践,帮助开发者深入理解ASP.NET的核心...

    ASP .NET 技术内幕621-690.rar

    在"ASP .NET 技术内幕621-690.rar"这个压缩包中,可能包含了一系列深入探讨ASP.NET技术的文章或章节,涵盖了从621到690的各个主题。虽然具体的文件名(如".pdg"格式)暗示这可能是图像或扫描文档,但我们可以根据...

    vb.net 技术内幕(美) 扫描版

    ASP.NET提供了丰富的服务器控件和页面生命周期管理,让开发者可以轻松创建交互式的Web应用。 6. **数据库访问**:ADO.NET是.NET Framework提供的数据库访问组件,通过它,你可以学习如何连接到SQL Server或其他...

    ASP .NET 技术内幕831-900.rar

    10. **部署和配置**:了解如何配置IIS服务器和Web.config文件以正确部署和运行ASP.NET应用程序是开发过程中的重要环节。 虽然具体的页码没有提供,但可以推测这些页面可能涵盖了以上提到的一些或所有概念,详细解释...

    基于ASP.net的跨平台智能云管理系统源码.zip

    【标题】中的“基于ASP.net的跨平台智能云管理系统源码”表明这是一个...通过深入研究这个项目,开发者不仅可以提升ASP.NET和C#的技能,还能了解到智能云管理系统的架构设计和实现细节,对云计算技术有更深入的理解。

    .NET技术内幕课件

    学习者会了解到如何使用ASP.NET创建动态网站、处理用户请求、实现数据绑定以及应用状态管理。 另外,.NET框架还支持Windows Forms和WPF(Windows Presentation Foundation)技术,用于构建桌面应用程序。Windows ...

    asp.net内部培训资料

    - ASP.NET Core是ASP.NET的最新版本,它是跨平台的,可以在Windows、Linux和macOS上运行,同时支持.NET Framework和.NET Core运行时。 - ASP.NET Core引入了Kestrel服务器、中间件(Middleware)架构、依赖注入...

    Visual C#.NET技术内幕

    从简单的控制台应用程序到复杂的Windows Forms或WPF应用,再到ASP.NET Web应用,C#.NET提供了广泛的应用场景。深入学习C#,意味着深入理解.NET生态,这将为开发高效、可靠的软件打下坚实的基础。

    vb.net技术内幕

    学习者还将接触如何使用VB.NET开发Web应用程序,包括ASP.NET MVC和ASP.NET Core,这些都是构建高性能、可扩展的Web应用的利器。 12. **.NET Framework与.NET Core** .NET Framework是VB.NET的基础,包含了类库、...

Global site tag (gtag.js) - Google Analytics