ASP.NET分析(一)--运行机制

 
ASP.NET的运行机制
1.   相关资源:
MSDN中关于ASP.NET应用程序生周期
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/de0d8a1c-b1bc-48e1-b246-26e32289a82f.htm
 
2.   建立相关对象的过程
(1) 第一次请求时创建HttpRuntime对象:
 
(2) 为每个请求创建对象 (HttpContext)
(3) 为每个请求创建 HttpApplication 对象:
3.   相关对象
1.       HttpRuntime
2.       ApplicationManager
3.       HostingEnvironment
4.   通过ashx分析
通过ashx可以看出ASP.NET的运行机制。
ashx与Java的Servlet类似,是原生态的处理http请求和输出的对象。
1.1.分析ASP.NET 2.0的默认配置
(1) 配置
<httpHandlers>
     <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="*.dsdgm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
     <add path="*.ssdgm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
     <add path="*.lsad" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
     <add path="*.ssmap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
     <add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
     <add path="*.dsprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
     <add path="*.lsaprototype" 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="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" />
     <add path="*" verb="*" type="System.Web.HttpMethodNotAllowedHandler" validate="True" />
</httpHandlers>
(2) 分析
观察.NET FrameWork 2.0的默认配置,我们发现,其中有如下几个类是用来处理不同类型的文件的:
后缀
说明
.aspx
System.Web.UI.PageHandlerFactory
Asp.net 的处理程序
.ashx
System.Web.UI.SimpleHandlerFactory
http 请求的处理程序
其它
System.Web.HttpForbiddenHandler
禁止请求的处理程序
 
System.Web.StaticFileHandler
 
*
System.Web.DefaultHttpHandler
 
trace.axd
System.Web.Handlers.TraceHandler
跟踪程序
WebResource.axd
System.Web.Handlers.AssemblyResourceLoader
 
.rem
System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory
.NET Remoting 处理程序
我们发现,所有的配置文件中,都实现了IHttpHandlerFactory接口,分析这个接口,可以看出,这是一个Factory,这个Factory通过不同的配置建立不同的处理http的对象。
       IHttpHandlerFactory的结构:
 IHttpHandler GetHandler()
返回实现 IHttpHandler 接口的类的实例。 
 ReleaseHandler
使工厂可以重用现有的处理程序实例。 
 (3) 结论
1.ApplicationManager.CreateObject() 创建HostingEnvironment
2.HostingEnvironement
3.HttpRuntime. ProcessRequest()
private void ProcessRequestInternal(HttpWorkerRequest wr)
{
      HttpContext context1 = new HttpContext(wr, false);
      context1.Response.InitResponseWriter();
      IHttpHandler handler1 = HttpApplicationFactory.GetApplicationInstance(context1);
      if (handler1 is IHttpAsyncHandler)
      {
             IHttpAsyncHandler handler2 = (IHttpAsyncHandler) handler1;
             context1.AsyncAppHandler = handler2;
             handler2.BeginProcessRequest(context1, this._handlerCompletionCallback, context1);
       }
       else
       {
             handler1.ProcessRequest(context1);
             this.FinishRequest(context1.WorkerRequest, context1, null);
       }
      }
      catch (Exception exception1)
      {
            context1.Response.InitResponseWriter();
            this.FinishRequest(wr, context1, exception1);
      }
}
4.各种页面处理做各种类型的ProcessRequest。
aspx如下:
private void ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint)
{
     
}
其序列图如下所示:
而ashx就是用户实现了IHttpHander接口。
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值