对于研究过内核的人肯定以为整个.net 最终开始是IISAPIRuntime.ProcessReuqest()然后调用ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRTyp)

其实还有一种方式,当你在使用.net 时,会自动在C:\WINDOWS\assembly的方件夹再次生成一个WebDev.WebHost

Microsoft.VisualStudio.WebHost.Server.Start()是整个的开始

Code

publicServer(intport,stringvirtualPath,stringphysicalPath,boolrequireAuthentication)

{

this.port=port;

this.vritualPath=virtualPath;

this.physicalPath=physicalPath.EndsWith(@"\", StringComparison.Ordinall)?physicalPath : (physicalPath+@"\");

this.requireAuthentication=requireAuthentication;

this.onSocketAccept=newWaitCallback(this.OnSocketAccept);//设置回调函数,asp.net 2.0流程的最终开始this.onStart=newWaitCallback(this.OnStart);

this.appManager=ApplicationManager.GetApplicationManager();

this.ObtainProcessToken();

    }

即,asp.net 流程开始时,会生成Server类,创建对应的Host,使用socket连接,然后

在OnSocketAccept的回调方法里会执行 host.ProcessRequest(conn);

host.ProcessRequest   --> new Request(this, conn).Process();

此处会调过HttpRuntime.ProcessRequest   (HttpWorkRequest wr) //此时wr必不是IsApiWorkRequest,而是一个SimpleWorkRequest

对ProcessRequest处理如下

HttpRuntime会先将这个请求放入RequestQueue,(队列默认有5000个请求)

如果当前线程池可用的话,立即开始一个线程处理

HttpApplication 类的一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求,这样,成员变量才可用于存储针对每个请求的数据。

IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(extraData);

Code

if(applicationInstanceisIHttpAsyncHandler)

{

       IHttpAsyncHandler handler2=(IHttpAsyncHandler) applicationInstance;

       extraData.AsyncAppHandler=handler2;

//调用HttpApplication.BeginProcessRequest开始流程

//_handlerCompletionCallback为异步结束时回调函数,

//extraData为HttpContexthandler2.BeginProcessRequest(extraData,this._handlerCompletionCallback, extraData);

  }else

{

        applicationInstance.ProcessRequest(extraData);

this.FinishRequest(extraData.WorkerRequest, extraData,null);

  }

由于Asp.net 2.0东西太多,只说说大体

在Http管道中,HttpApplication是核心

下面是HttpApplication.Init()核心代码如下

Code

if(applicationInstanceisIHttpAsyncHandler)

{

       IHttpAsyncHandler handler2=(IHttpAsyncHandler) applicationInstance;

       extraData.AsyncAppHandler=handler2;

//调用HttpApplication.BeginProcessRequest开始流程

//_handlerCompletionCallback为异步结束时回调函数,

//extraData为HttpContexthandler2.BeginProcessRequest(extraData,this._handlerCompletionCallback, extraData);

  }else

{

        applicationInstance.ProcessRequest(extraData);

this.FinishRequest(extraData.WorkerRequest, extraData,null);

  }

返回用户当前是否启用Url重写,再也不用手动处理URL重写啦

UrlMappingsSection urlMappings = RuntimeConfig.GetAppConfig().UrlMappings;

flag = urlMappings.IsEnabled && (urlMappings.UrlMappings.Count > 0);

context.ConfigurationPath

=

context.Request.ApplicationPathObject;

using

(HttpContextWrapper wrapper

=

new

HttpContextWrapper(context))

{

//初始化所有的模块this.InitModules();

this._context=context;

this._hideRequestResponse=true;

//初始化自身this.Init();

this._hideRequestResponse=false;

this._context=null;

       ArrayList steps=newArrayList();

//验证路径steps.Add(newValidatePathExecutionStep(this));

if(flag)

{

//asp.net 2.0内置URL重写功能steps.Add(newUrlMappingsExecutionStep(this));

     }   steps.Add(newMapHandlerExecutionStep(this));

    steps.Add(newCallHandlerExecutionStep(this));

   steps.Add(newCallFilterExecutionStep(this));

   steps.CopyTo(this._execSteps);

this._resumeStepsWaitCallback=newWaitCallback(this.ResumeStepsWaitCallback);

HttpApplication.BeginProcessRequest()时会调用HttpApplication.ResumeSteps()

就是对上面IExecutionStep进行依次的处理

在MapHandlerExecutionStep时,会根据如何配置取出对应的工厂

Asp.net 2.0 根 Web.config

<

httpHandlers

>

<

add path

=

"

*.aspx

"

verb

=

"

*

"

type

=

"

System.Web.UI.PageHandlerFactory

"

validate

=

"

True

"

/>

httpHandlers

>

今天只谈.aspx

上面都是大家知道的,没什么意思啦

咱来点有意思的

搞.net 的人都知道.aspx会使用PageHandlerFactory .GetHandlerHelper()返回一个IHttpHandler

大家有没有发现

GethandlerHelper() 里有下面的方法

Page page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page), context, true, true) as Page;

Code

internalstaticobjectCreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context,boolallowCrossApp,boolnoAssert)

{

//BuildResult

//BuildResultCompiledAssemblyBase

//BuildResultCompiledType

//BuildResult

//BuildResultNoCompileTemplateControl

//BuildResultNoCompilePageITypedWebObjectFactory factory=GetVirtualPathObjectFactory(virtualPath, context, allowCrossApp, noAssert);//注意此时是什么对象,下面再谈i f (factory==null)

{

returnnull;

      }      Util.CheckAssignableType(requiredBaseType, factory.InstantiatedType);

using(ClientImpersonationContext context2=newClientImpersonationContext(context))

{

returnfactory.CreateInstance();

      }}

其实这个Page是一个BuildRequest,asp.net 2.0在第一次请求时会对dll再一次的编译,

举个例子你写了一个webForm1.aspx,里面有一个Button,

此时.net 会从webForm1.axp派生出一个新的类

如下

Code

//[CompilerGlobalScope]

//public class webform1_aspx : WebForm1, IRequiresSessionState, IHttpHandler

//{

Fields

//private static object __fileDependencies;

//private static bool __initialized;

..

//protected override void FrameworkInitialize()

//{

//base.FrameworkInitialize();

//this.__BuildControlTree(this);//此处创建控件树,(CtronlBuilder的作用在这里!!!!!!!!!!!)

//base.AddWrappedFileDependencies(__fileDependencies);

//base.Request.ValidateInput();

//}

//public override int GetTypeHashCode()

//{

//return 0x579d6af1;

//}

//public override void ProcessRequest(HttpContext context)

//{

//base.ProcessRequest(context);

//}

//}

当您请求WebForm1时

ITypedWebObjectFactory.GetType() 是BuildResultCompiledTemplateType它是BuildResultCompiledType的实现

ITypedWebObjectFactory.CreateInstance()就是BuildResultCompiledType.CreateInstance()

它会使用

ObjectFactoryCodeDomTreeGenerator.GetFastObjectCreationDelegate(this.ResultType);

在新生成的程序集中Asp命名空间下有这个类呀,直接new webform1_aspx ()

也就是说,此时你请求webform1,实际调用的是新生所在webform1_aspx ()

下面会依次执行

CallHandlerExecutionStep   处理输出流

CallFilterExecutionStep()调用webform1_aspx.ProcessRequest()

...

下面说一下,你请求的webForm1_aspx是如何转成html的即,Render时的顺序:

原理如下图

aspx怎么转成java,Asp.net 2.0 中.aspx请求,即如何生成响应的Html文件(原创)相关推荐

  1. 在ASP.NET 2.0中使用样式、主题和皮肤

    ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme).接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉.通过改 ...

  2. 在ASP.NET 2.0中建立站点导航层次

    站点导航提供程序--ASP.NET 2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局.默认的站点导航提供程序是基于XML的,但是你 ...

  3. ASP.NET 2.0 中配合 Master Page 使用的优化 CSS 模型

    ASP.NET 2.0 中增加了内建的 MasterPage 的支持,这对我们来说是一个很大的便利.然而经过一段时间的使用,我发现 MasterPage 并不是那么完美:嵌套的 MasterPage ...

  4. 怎么在ASP.NET 2.0中使用Membership

    摘要: 本文介绍了怎么在ASP.NET 2.0中使用Membership新特性,并且介绍了怎么两种不同的Membership的Provider:ActiveDirectoryMembershipPro ...

  5. ASP.NET 2.0中使用自定义provider (2)

    ASP.NET 2.0中使用自定义provider (2) 在tech ed 2005上,有对asp.net 2.0的介绍,其中讲到asp.net 2.0提供了很多功能,让程序员做少很多东西,这引起了 ...

  6. ASP.NET 2.0中发送电子邮件

    ASP.NET 2.0中发送电子邮件 ASP.NET 2.0 中发送电子邮件变得非常简单.发送电子邮件的类库主要在命名空间System.Net.Mail中,在这个命名空间中有两个核心类是:       ...

  7. ASP.NET 2.0中CSS失效的问题总结

    ASP.NET 2.0中CSS失效的问题总结 Posted on 2007-09-02 12:34 上校 阅读(225) 评论(0) 编辑 收藏 所属分类: CSS, ASP.NET 经常有人遇到AS ...

  8. [翻译]在Asp.net 2.0中操作数据::母板页和站点导航

    在Asp.net 2.0中操作数据::母板页和站点导航 英文原文 |  下载示例代码(C#)  |  翻译进度  |  英文教程目录 导言 通常,用户友好的个性化站点都有着一致的,站点统一的页面布局和 ...

  9. ASP.NET 2.0 中的主版頁面

    Stephen Walther Superexpert 2004 年 8 月 適用於:    Microsoft ASP.NET 2.0 主版頁面可讓您建立遵照一致佈景主題與樣式的 ASP.NET 頁 ...

最新文章

  1. Python黑客入门:暴力破解zip,零基础也可以学会!
  2. 牛客网学习笔记-day01
  3. Always keep in mind
  4. 图 邻接表 建立 深度遍历 广度遍历
  5. Ubuntu10.04下安装SQLite3
  6. GraphX 基础一
  7. C++ WindowsAPI 教程:MessageBox函数详解(原创)
  8. wps带阴影的边框怎么设置_wps文字加阴影边框怎么设置
  9. 自动化测试qq空间登录
  10. 有赞 BI 平台设计及实现
  11. 百度推广关键字质量度优化指南
  12. 有了繁难字库生僻字不用造(一)
  13. 清华大学出版社大数据可视化技术与应用第六章Tableau实训
  14. ubuntu系统的文件权限获取
  15. docker(1):什么是 Docker
  16. 自动遍历测试方法及常见技术
  17. PLM系统的技术现状和发展趋势
  18. pgr_createTopology
  19. X-RAY 扫到dirscan/sourcemap/default漏洞
  20. 智慧交通:智慧公路建设探索

热门文章

  1. 医疗机构被勒索软件攻击的可能性是金融机构的114倍
  2. Linux下source命令
  3. Listview 的应用 Day04 2014-0605
  4. 如何把一个bin文件捆绑到一个可执行文件exe中?
  5. 腾达A6无线路由器的几种连接模式
  6. Sequelize小记
  7. java-Hyper-V
  8. PHP. 02®. Ajax异步处理、常见的响应状态、XMLHttpRequest对象及API、ajax的get/post方法、...
  9. Maven核心概念(转)
  10. 操作系统中死锁的概念