新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → Asp.Net页面执行流程分析 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6732 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Asp.Net页面执行流程分析 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     kelvinmok 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:66
      门派:XML.ORG.CN
      注册:2008/9/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给kelvinmok发送一个短消息 把kelvinmok加入好友 查看kelvinmok的个人资料 搜索kelvinmok在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看kelvinmok的博客楼主
    发贴心情 Asp.Net页面执行流程分析


    在我的上一篇文章中说到了HttpModule、HttpHandle的简单使用,我

    们可以利用它们在页面请求的过程中加入自己的事件处理程序。那么在一个aspx

    页面请求时后台到底做了什么?当然asp.net做了很多事情,过程也比较复杂,本

    文主要分析一下大体的流程。总体流程如下:
    请求一个页面时首先被WWW服务截获(inetinfo.exe进程),这个进程首先判断页面

    的后缀,然后根据IIS中的配置来决定调用哪个扩展程序,比如aspx的页面就会调

    用c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,aspne

    t_isapi.dll将请求发送给w3wp.exe进程(我们在调试IIS中网站时就是把VS2005附

    加到这个进程上的)。
    接下来w3wp.exe进程就会调用.net类库进行具体处理:
    ISAPIRuntime-->HttpRuntime-->HttpApplicationFactory-->HttpApplication--

    >HttpModule--HttpHandlerFactory-->HttpHandler 这也是本文主要分析的地方

    。 下面只是列出主要流程,如果喜欢钻研的同学可以用Reflector去查看
    一:ISAPIRuntime
           bool useOOP = iWRType == 1;
            wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);
            wr.Initialize();
            string appPathTranslated = wr.GetAppPathTranslated();
            string appDomainAppPathInternal =

    HttpRuntime.AppDomainAppPathInternal;
            if ((appDomainAppPathInternal == null) ||

    StringUtil.EqualsIgnoreCase(appPathTranslated,

    appDomainAppPathInternal))
            {
                HttpRuntime.ProcessRequestNoDemand(wr);
                return 0;
            }
            

    HttpRuntime.ShutdownAppDomain(ApplicationShutdownReason.PhysicalApplica

    tionPathChanged, SR.GetString("Hosting_Phys_Path_Changed", new object[]

    { appDomainAppPathInternal, appPathTranslated }));
            return 1;
    它的主要作用是调用一些非托管代码生成HttpWorkerRequest对象,该对象包含当

    前请求的所有信息,然后传递给HttpRuntime,这里生成的HttpWorkerRequest对

    象可以直接在我们的页面中调用的,通过它取得原始的请求信息:
                IServiceProvider provider =

    (IServiceProvider)HttpContext.Current;
                HttpWorkerRequest wr =

    (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
    二:HttpRuntime
    最主要的就是private void ProcessRequestInternal(HttpWorkerRequest wr)方

    法:         context = new HttpContext(wr, false);
            IHttpHandler applicationInstance =

    HttpApplicationFactory.GetApplicationInstance(context);
      IHttpAsyncHandler handler2 = (IHttpAsyncHandler) applicationInstance;
      context.AsyncAppHandler = handler2;
      handler2.BeginProcessRequest(context,

    this._handlerCompletionCallback, context);
            1、根据HttpWorkerRequest对象生成HttpContext,HttpContext应该大

    家都很熟悉的,它包含request、response等属性,在页面中经常会用到的;
    2、调用HttpApplicationFactory来生成IHttpHandler(这里生成的是一个默认的H

    ttpApplication对象,HttpApplication也是IHttpHandler接口的一个实现)
    3、调用HttpApplication对象执行请求
    三:HttpApplicationFactory
    正如2.2中所提到的,这里主要是生成一个HttpApplication对象:

    internal static string GetApplicationFile()
    {
         return Path.Combine(HttpRuntime.AppDomainAppPathInternal,

    "global.asax");
    }
    首先会查看是否存在global.asax文件,如果有的话就用它来生成HttpApplicatio

    n对象,从这里我们可以看到global.asax的文件名是在asp.net的框架中写死的,

    不能修改的。如果这个文件不存在就使用默认的对象。
    创建好HttpApplication之后对它进行初始化:
        application = (HttpApplication)

    HttpRuntime.CreateNonPublicInstance(this._theApplicationType);
    using (ApplicationImpersonationContext context2 = new

    ApplicationImpersonationContext())
    {
         application.InitInternal(context, this._state,

    this._eventHandlerMethods);
    }
    四、HttpApplication
    这个是比较复杂也比较重要的一个对象
    首先是执行初始化操作,比较重要的一步就是进行HttpModule的初始化:        

    private void InitModules()
            {
                this._moduleCollection =

    RuntimeConfig.GetAppConfig().HttpModules.CreateModules();
                this.InitModulesCommon();
            }它会读取web.config中所有HttpModule的配置
    在HookupEventHandlersForApplicationAndModules方法中绑定Module的事件处理

    程序接着进行事件实际绑定:
    if (HttpRuntime.UseIntegratedPipeline)
    {
         this._stepManager = new PipelineStepManager(this);
    }
    else
    {
         this._stepManager = new ApplicationStepManager(this);
    }
    this._stepManager.BuildSteps(this._resumeStepsWaitCallback);
    在ApplicationStepManager的BuildSteps方法中可以看到事件的绑定执行顺序:

    app.CreateEventExecutionSteps(HttpApplication.EventBeginRequest,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthenticatio

    n, steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequ

    est, steps);
    app.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest

    , steps);


    app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCa

    che, steps);
    steps.Add(new HttpApplication.MapHandlerExecutionStep(app));


    app.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandle

    r, steps);


    app.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestSt

    ate, steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExe

    cute, steps);
    steps.Add(new HttpApplication.CallHandlerExecutionStep(app));


    app.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerEx

    ecute, steps);


    app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestSt

    ate, steps);
    steps.Add(new HttpApplication.CallFilterExecutionStep(app));
    app.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache,

    steps);


    app.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCac

    he, steps);
    this._endRequestStepIndex = steps.Count;
    app.CreateEventExecutionSteps(HttpApplication.EventEndRequest, steps);
    steps.Add(new HttpApplication.NoopExecutionStep());
    注意上面红色标注的MapHandlerExecutionStep(读取所有的HttpHandler配置)、C

    allHandlerExecutionStep就是对Handle程序进行处理的,也就是说在web.config

    中配置的HttpHandler都是在这里进行处理的,执行顺序如上所示
    然后就是调用2.3中的方法执行请求:
    Code
            IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext

    context, AsyncCallback cb, object extraData)
            {
                this._context = context;
                this._context.ApplicationInstance = this;
                this._stepManager.InitRequest();
                this._context.Root();
                HttpAsyncResult result = new HttpAsyncResult(cb,

    extraData);
                this.AsyncResult = result;
                if (this._context.TraceIsEnabled)
                {
                    HttpRuntime.Profile.StartRequest(this._context);
                }
                this.ResumeSteps(null);
                return result;
            }
    在ResumeSteps中就是执行事件处理程序。

    转自www.gdglc.com
    欢迎www.gdglc.com留言


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/9/23 11:00:00
     
     kelvinmok 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:66
      门派:XML.ORG.CN
      注册:2008/9/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给kelvinmok发送一个短消息 把kelvinmok加入好友 查看kelvinmok的个人资料 搜索kelvinmok在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看kelvinmok的博客2
    发贴心情 
    五、HttpModule
    在系统web.config中默认的配置有:
    Code
        <httpModules>
          <add name="OutputCache"

    type="System.Web.Caching.OutputCacheModule"/>
          <add name="Session"

    type="System.Web.SessionState.SessionStateModule"/>
          <add name="WindowsAuthentication"

    type="System.Web.Security.WindowsAuthenticationModule"/>
          <add name="FormsAuthentication"

    type="System.Web.Security.FormsAuthenticationModule"/>
          <add name="PassportAuthentication"

    type="System.Web.Security.PassportAuthenticationModule"/>
          <add name="RoleManager"

    type="System.Web.Security.RoleManagerModule"/>
          <add name="UrlAuthorization"

    type="System.Web.Security.UrlAuthorizationModule"/>
          <add name="FileAuthorization"

    type="System.Web.Security.FileAuthorizationModule"/>
          <add name="AnonymousIdentification"

    type="System.Web.Security.AnonymousIdentificationModule"/>
          <add name="Profile" type="System.Web.Profile.ProfileModule"/>
          <add name="ErrorHandlerModule"

    type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile,

    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
          <add name="ServiceModel"

    type="System.ServiceModel.Activation.HttpModule, System.ServiceModel,

    Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        </httpModules>
    基本使用方法可以参见我的上一篇文章

    六、HttpHandlerFactory、HttpHandler
    这两个对象在web.config中的配置方法是相同的,默认配置有:
    Code
         <add path="*.rules" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.xoml" verb="*"

    type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel,

    Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

    validate="false"/>
          <add path="trace.axd" verb="*"

    type="System.Web.Handlers.TraceHandler" validate="true"/>
          <add path="WebResource.axd" verb="GET"

    type="System.Web.Handlers.AssemblyResourceLoader" validate="true"/>
          <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler"

    validate="true"/>
          <add path="*.aspx" verb="*"

    type="System.Web.UI.PageHandlerFactory" validate="true"/>
          <add path="*.ashx" verb="*"

    type="System.Web.UI.SimpleHandlerFactory" validate="true"/>
          <add path="*.asmx" verb="*"

    type="System.Web.Services.Protocols.WebServiceHandlerFactory,

    System.Web.Services, Version=2.0.0.0, Culture=neutral,

    PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
          <add path="*.rem" verb="*"

    type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,

    System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral,

    PublicKeyToken=b77a5c561934e089" validate="false"/>
          <add path="*.soap" verb="*"

    type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,

    System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral,

    PublicKeyToken=b77a5c561934e089" validate="false"/>
          <add path="*.asax" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.ascx" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.master" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.skin" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.browser" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.sitemap" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.dll.config" verb="GET,HEAD"

    type="System.Web.StaticFileHandler" validate="true"/>
          <add path="*.exe.config" verb="GET,HEAD"

    type="System.Web.StaticFileHandler" validate="true"/>
          <add path="*.config" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.csproj" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.vb" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.vbproj" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.webinfo" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.licx" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.resx" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.resources" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.mdb" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.vjsproj" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.java" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.jsl" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.ldb" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.ad" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.dd" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.ldd" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.sd" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.adprototype" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.lddprototype" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.sdm" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.sdmDocument" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler"

    validate="true"/>
          <add path="*.exclude" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.refresh" verb="*"

    type="System.Web.HttpForbiddenHandler" validate="true"/>
          <add path="*.svc" verb="*"

    type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel,

    Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

    validate="false"/>
          <add path="*" verb="GET,HEAD,POST"

    type="System.Web.DefaultHttpHandler" validate="true"/>
          <add path="*" verb="*"

    type="System.Web.HttpMethodNotAllowedHandler" validate="true"/>
        </httpHandlers>
    要注意的是相同的后缀名配置多次的话,后面的配置会把前面的覆盖。

    这里我们重点看一下aspx的配置:System.Web.UI.PageHandlerFactory
    这是一个HttpHandlerFactory对象,根据不同的Page生成不同的HttpHandler对象

    (我们自己的Page页面都是一个IHttpHandler):
        Page page = BuildManager.CreateInstanceFromVirtualPath(virtualPath,

    typeof(Page), context, true, true) as Page;
        if (page == null)
        {
            return null;
        }
        page.TemplateControlVirtualPath = virtualPath;
        return page;
    这里会调用web.config中的buildProviders配置编译页面:
    Code
    <buildProviders>
            <add extension=".aspx"

    type="System.Web.Compilation.PageBuildProvider"/>
            <add extension=".ascx"

    type="System.Web.Compilation.UserControlBuildProvider"/>
            <add extension=".master"

    type="System.Web.Compilation.MasterPageBuildProvider"/>
            <add extension=".asmx"

    type="System.Web.Compilation.WebServiceBuildProvider"/>
            <add extension=".ashx"

    type="System.Web.Compilation.WebHandlerBuildProvider"/>
            <add extension=".soap"

    type="System.Web.Compilation.WebServiceBuildProvider"/>
            <add extension=".resx"

    type="System.Web.Compilation.ResXBuildProvider"/>
            <add extension=".resources"

    type="System.Web.Compilation.ResourcesBuildProvider"/>
            <add extension=".wsdl"

    type="System.Web.Compilation.WsdlBuildProvider"/>
            <add extension=".xsd"

    type="System.Web.Compilation.XsdBuildProvider"/>
            <add extension=".js"

    type="System.Web.Compilation.ForceCopyBuildProvider"/>
            <add extension=".lic"

    type="System.Web.Compilation.IgnoreFileBuildProvider"/>
            <add extension=".licx"

    type="System.Web.Compilation.IgnoreFileBuildProvider"/>
            <add extension=".exclude"

    type="System.Web.Compilation.IgnoreFileBuildProvider"/>
            <add extension=".refresh"

    type="System.Web.Compilation.IgnoreFileBuildProvider"/>
            <add extension=".xoml"

    type="System.ServiceModel.Activation.WorkflowServiceBuildProvider,

    System.WorkflowServices, Version=3.5.0.0, Culture=neutral,

    PublicKeyToken=31bf3856ad364e35"/>
            <add extension=".svc"

    type="System.ServiceModel.Activation.ServiceBuildProvider,

    System.ServiceModel, Version=3.0.0.0, Culture=neutral,

    PublicKeyToken=b77a5c561934e089"/>
          </buildProviders>

    这样就可以进入我们的Page执行了,大的执行顺序可以参见第四部分的描述,它

    也就是一个HttpHandler.q


    转自www.gdglc.com
    欢迎www.gdglc.com留言

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/10/28 10:35:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/3 5:00:31

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    105.469ms