技术开发 频道

ASP.NET底层架构探索之处理请求

  对象池以一个更小的数字开始;通常是一个然后增长到和同时发生的需要被处理的请求数量一样.对象池被监视,这样在大负载下它可能会增加到最大的实例数量,当负载降低时会变回一个更小的数字。

  HttpApplication是你的Web程序的外部包装器,而且它被映射到在Global.asax里面定义的类上.它是进入HttpRuntime的第一个入口点.如果你查看Global.asax(或者对应的代码类)你会发现这个类直接继承自HttpApplication:

public class Global : System.Web.HttpApplication

  HttpApplication的主要职责是作为Http管道的事件控制器,所以它的接口主要包含的是事件.事件挂接是非常广泛的,包括以下这些:

  ·BeginRequest

  ·AuthenticateRequest

  ·AuthorizeRequest

  ·ResolveRequestCache

  ·AquireRequestState

  ·PreRequestHandlerExecute

  ·…Handler Execution…

  ·PostRequestHandlerExecute

  ·ReleaseRequestState

  ·UpdateRequestCache

  ·EndRequest

  每个事件在Global.assx文件中以Application_前缀开头的空事件作为实现.例如, Application_BeginRequest(),Application_AuthorizeRequest()..这些处理器为了便于使用而提供因为它们是在程序中经常被使用的,这样你就不用显式的创 建这些事件处理委托了。

  理解每个ASP.NET虚拟目录在它自己的应用程序域中运行,而且在应用程序域中有多个从ASP.NET管理的池中返回的HttpApplication实例同时运行,是非常重要的,这是多个请求可以被同时处理而不互相妨碍的原因。

  查看列表4来获得应用程序域,线程和HttpApplication之间的关系。

  列表4-显示应用程序域,线程和HttpApplication实例之间的关系。

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
this.ApplicationId = ((HowAspNetWorks.Global) HttpContext.Current.ApplicationInstance).ApplicationId ;
this.ThreadId = AppDomain.GetCurrentThreadId();

 
this.DomainId = AppDomain.CurrentDomain.FriendlyName;

 
this.ThreadInfo = "ThreadPool Thread: " + System.Threading.Thread.CurrentThread.IsThreadPoolThread.ToString() +"<br>Thread Apartment: " +
System.Threading.Thread.CurrentThread.ApartmentState.ToString();


// *** Simulate a slow request so we can see multiple
// requests side by side.
System.Threading.Thread.Sleep(3000);
}

  这是随sample提供的demo的一部分,运行的结果在图5中显示.运行两个浏览器,打开这个演示页面可以看到不同的ID。

  你可能注意到在大多数请求上,当线程和HttpApplication ID变化时应用程序域ID却保持不变,虽然它们也可能重复(指线程和HttpApplication ID).HttpApplication是从一个集合中取出,在随后到来的请求中可以被复用的,所以它的ID有时是会重复的.注意Application实例并不和特定的线程绑定-确切的说它们是被指定给当前请求的活动线程。

0
相关文章