• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET运行机制续(完结)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

上一篇说到applicationInstance会执行一些列的事件。下面是我在msdn上找到有关asp.net程序生命周期相关的描述及图片

声明周期的起始

ASP.NET 处理已映射到其上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。

ASP.NET 接收对应用程序的第一个请求

HostingEnvironment的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。

 

为每个请求创建 ASP.NET 核心对象

HttpResponse 对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。

HttpApplication 对象分配给请求

HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。

注意
HttpApplication 实例。

Init 方法。

 

由 HttpApplication 管线处理请求。

HttpApplication 类的开发人员尤其需要注意这些事件。

  1. 脚本侵入概述。

  2. UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

  3. BeginRequest 事件;第一个事件

  4. AuthenticateRequest 事件;验证请求,开始检查用户的身份,一把是获取请求的用户信息

  5. PostAuthenticateRequest 事件;用户身份已经检查完毕,检查完成后可以通过HttpContext的User属性获取到,微软内置的身份验证机制,平时很少用到

  6. AuthorizeRequest 事件;开始进行用户权限检查,如果用户没有通过上面的安全检查,一般会直接调至EndRequest事件,也就是直接跳至最后一个事件

  7. PostAuthorizeRequest 事件;用户请求已经获取授权

  8. ResolveRequestCache 事件;缓存,如果存在以前处理的缓存结果,则不再进行请求处理工作,返回缓存结果

  9. PostResolveRequestCache 事件;缓存检查结束

  10. Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译;创建所请求的前台页面类

  11. PostMapRequestHandler 事件;已经创建处理请求的处理器对象(IHttpHandler)

  12. AcquireRequestState 事件;获取请求状态,一般用于获取session

  13. PostAcquireRequestState 事件。已经获取到了session,如果获取到,则将session的值封装到httpcontext中的session属性中去,

  14. PreRequestHandlerExecute 事件。以为上个事件已经封装了session信息,所以接下来就是验证身份信息的最好位置,如果不通过,直接处理,提高效率。这里也是准备执行处理程序,及调用HttpContext中Handler属性的ProcessRequest

  15. 例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. PostRequestHandlerExecute 事件;页面的ProcessRequest方法执行完成

  17. ReleaseRequestState 事件;准备释放请求状态session

  18. PostReleaseRequestState 事件;已经释放请求状态

  19. Filter 属性,则执行响应筛选。

  20. UpdateRequestCache 事件;更新缓存

  21. PostUpdateRequestCache 事件;更新缓存完毕

  22. EndRequest 事件;结束请求

  23. PreSendRequestHeaders 事件;可通过发送的头信息设置参数,例如将类型设置为text/plain等

  24. PreSendRequestContent 事件;处理数据,如配置压缩,则可在这里对数据进行压缩发送

好了,不贴人家的东西了,感兴趣的可以到原网站去看一下。我们重点就是看一下HttpApplication管线处理请求。下面是对事件的解释

 
  名称 说明
AcquireRequestState 当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
AuthenticateRequest 当安全模块已建立用户标识时发生。
AuthorizeRequest 当安全模块已验证用户授权时发生。
BeginRequest 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
Disposed 在释放应用程序时发生。
EndRequest 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生。
Error 当引发未经处理的异常时发生。
LogRequest 恰好在 ASP.NET 为当前请求执行任何记录之前发生。
MapRequestHandler 基础结构。在选择了用来响应请求的处理程序时发生。
PostAcquireRequestState 在已获得与当前请求关联的请求状态(例如会话状态)时发生。
PostAuthenticateRequest 当安全模块已建立用户标识时发生。
PostAuthorizeRequest 在当前请求的用户已获授权时发生。
PostLogRequest LogRequest 事件的所有事件处理程序后发生。
PostMapRequestHandler 在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。
PostReleaseRequestState 在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生。
PostRequestHandlerExecute 在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生。
PostResolveRequestCache 在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。
PostUpdateRequestCache 在 ASP.NET 完成缓存模块的更新并存储了用于从缓存中为后续请求提供服务的响应后,发生此事件。
PreRequestHandlerExecute 恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
PreSendRequestContent 恰好在 ASP.NET 向客户端发送内容之前发生。
PreSendRequestHeaders 恰好在 ASP.NET 向客户端发送 HTTP 标头之前发生。
ReleaseRequestState 该事件将使状态模块保存当前状态数据。
RequestCompleted 发生,在与该请求已释放的托管对象。
ResolveRequestCache 在 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务后发生,从而绕过事件处理程序(例如某个页或 XML Web services)的执行。
UpdateRequestCache 当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。

看一下上面的管线处理请求中标号的10和15,分别是创建前台页面类和调用页面类的ProcessRequest方法的地方。这在我们的上篇文章中说到了。下面我们重点说Application_Start方法执行的地方,ProcessRequest方法都做了什么。

我们都知道Application_Start是程序的入口地方,类似与我们的main函数。但是我在msdn上也没能查到Application_Start是在哪里调用了,但是我们似乎是可以找到这个方法调用的地方,让我们来反编译HttpRuntime(为什么选择反编译这个类?上篇文章里面会有答案)的ProcessRequestNow()方法,继续看_theRuntime.ProcessRequestInternal(wr);我们看ProcessRequestInternal方法中的IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);,我们可以看出来HttpApplicationFactory是个静态类,我们可以看到该静态类里面有成员internal const string applicationFileName = "global.asax";private static HttpApplicationFactory _theApplicationFactory;private bool _appOnStartCalled;这里我们知道了为什么global.asax文件为什么不能修改文件名,因为这里已经写死了。而后面_appOnStartCalled变量记录着程序的application_start方法是否被调用过,如没被调用过,则为false,进而调用程序的application_start,反之则不进行调用。看GetApplicationInstance中会有判断过程_theApplicationFactory.EnsureAppStartCalled(context);。所以程序的Application_Start()方法的执行顺序肯定先于所有的管线处理请求中的事件。

下面我们来看一下页面的ProcessRequest方法都做了什么操作。也就是开始页面生命周期。

我新建了一个ReflectWeb项目,又添加了demo.aspx页面,页面内容如下

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Demo.aspx.cs" Inherits="ReflectorWeb.Demo" %>
 2 
 3 <!DOCTYPE html>
 4 
 5 <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 8     <title></title>
 9 </head>
10 <body>
11     <form id="form1" runat="server">
12     <div>
13         程序集位置:<%=this.GetType().Assembly.Location %><br />
14         TextBox1:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
15         TextBox2:<input type="text" runat="server" id="TextBox2" /><br />
16         TextBox3:<input type="text" id="TextBox3" /><br />
17     </div>
18     </form>
19 </body>
20 </html>
View Code

后台类内容很简单

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.UI;
 6 using System.Web.UI.WebControls;
 7 
 8 namespace ReflectorWeb
 9 {
10     public partial class Demo : System.Web.UI.Page
11     {
12         protected void Page_Load(object sender, EventArgs e)
13         {
14             Console.WriteLine("test console");
15             //byte[] tempData = System.Text.Encoding.UTF8.GetBytes("测试Page_Load方法中使用Response.Write方法输出");
16             Response.Write("测试Page_Load方法中使用Response.Write方法输出");
17         }
18     }
19 }
View Code

而页面效果如下

下面我们来反编译一下这个程序集,看一下这个程序集里面的内容

程序集里面有个demo_aspx类,这就是我们前台页面生成后的类了,页面类代码如下:

 1 [CompilerGlobalScope]
 2 public class demo_aspx : Demo, IRequiresSessionState, IHttpHandler
 3 {
 4     // Fields
 5     private static object __fileDependencies;
 6     private static bool __initialized;
 7     private static MethodInfo __PageInspector_BeginRenderTracingMethod;
 8     private static MethodInfo __PageInspector_EndRenderTracingMethod;
 9     private static MethodInfo __PageInspector_SetTraceDataMethod;
10 
11     // Methods
12     static demo_aspx();
13     [DebuggerNonUserCode]
14     public demo_aspx();
15     [DebuggerNonUserCode]
16     private LiteralControl __BuildControl__control2();
17     [DebuggerNonUserCode]
18     private HtmlHead __BuildControl__control3();
19     [DebuggerNonUserCode]
20     private HtmlMeta __BuildControl__control4();
21     [DebuggerNonUserCode]
22     private HtmlTitle __BuildControl__control5();
23     [DebuggerNonUserCode]
24     private LiteralControl __BuildControl__control6();
25     [DebuggerNonUserCode]
26     private LiteralControl __BuildControl__control7();
27     [DebuggerNonUserCode]
28     private HtmlForm __BuildControlform1();
29     [DebuggerNonUserCode]
30     private TextBox __BuildControlTextBox1();
31     [DebuggerNonUserCode]
32     private HtmlInputText __BuildControlTextBox2();
33     [DebuggerNonUserCode]
34     private void __BuildControlTree(demo_aspx __ctrl);
35     private void __PageInspector_BeginRenderTracing(object[] parameters);
36     private void __PageInspector_EndRenderTracing(object[] parameters);
37     private static MethodInfo __PageInspector_LoadHelper(string helperName);
38     private void __PageInspector_SetTraceData(object[] parameters);
39     private void __Renderform1(HtmlTextWriter __w, Control parameterContainer);
40     [DebuggerNonUserCode]
41     protected override void FrameworkInitialize();
42     [DebuggerNonUserCode]
43     public override int GetTypeHashCode();
44     [DebuggerNonUserCode]
45     public override void ProcessRequest(HttpContext context);
46 
47     // Properties
48     protected HttpApplication ApplicationInstance { get; }
49     protected DefaultProfile Profile { get; }
50 }
51 
52  
53 Expand Methods
54  
View Code

注意一下,该类继承自Demo类,也就是后台类,而后台类又继承自Page类。下面进入ProcessRequest方法 又调用了父类的ProcessRequest方法base.ProcessRequest(context);这个Page类的一个方法,看这个类的组成

  1 [Designer("Microsoft.VisualStudio.Web.WebForms.WebFormDesigner, Microsoft.VisualStudio.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(IRootDesigner)), DefaultEvent("Load"), ToolboxItem(false), DesignerCategory("ASPXCodeBehind"), DesignerSerializer("Microsoft.VisualStudio.Web.WebForms.WebFormCodeDomSerializer, Microsoft.VisualStudio.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.Serialization.TypeCodeDomSerializer, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
  2 public class Page : TemplateControl, IHttpHandler
  3 {
  4     // Fields
  5     internal HttpApplicationState _application;
  6     private bool _aspCompatMode;
  7     private AspCompatApplicationStep _aspCompatStep;
  8     private bool _asyncMode;
  9     private PageAsyncTaskManager _asyncTaskManager;
 10     private TimeSpan _asyncTimeout;
 11     private bool _asyncTimeoutSet;
 12     private Control _autoPostBackControl;
 13     internal Cache _cache;
 14     private bool _cachedRequestViewState;
 15     private ICallbackEventHandler _callbackControl;
 16     private ArrayList _changedPostDataConsumers;
 17     private string _clientQueryString;
 18     private ClientScriptManager _clientScriptManager;
 19     private string _clientState;
 20     private bool _clientSupportsJavaScript;
 21     private bool _clientSupportsJavaScriptChecked;
 22     private string _clientTarget;
 23     private bool _containsCrossPagePost;
 24     private bool _containsEncryptedViewState;
 25     private IDictionary _contentTemplateCollection;
 26     internal HttpContext _context;
 27     private ArrayList _controlsRequiringPostBack;
 28     private StringSet _controlStateLoadedControlIds;
 29     private Stack _dataBindingContext;
 30     private string _descriptionToBeSet;
 31     private bool _designMode;
 32     private bool _designModeChecked;
 33     private CultureInfo _dynamicCulture;
 34     private CultureInfo _dynamicUICulture;
 35     private ArrayList _enabledControls;
 36     private bool _enableEventValidation;
 37     private bool _enableViewStateMac;
 38     private ViewStateEncryptionMode _encryptionMode;
 39     internal string _errorPage;
 40     private Control _focusedControl;
 41     private string _focusedControlID;
 42     private bool _fOnFormRenderCalled;
 43     private HtmlForm _form;
 44     private bool _fPageLayoutChanged;
 45     private bool _fPostBackScriptRendered;
 46     private bool _fRequirePostBackScript;
 47     private bool _fRequireWebFormsScript;
 48     private bool _fWebFormsScriptRendered;
 49     private bool _haveIdSeparator;
 50     private HtmlHead _header;
 51     internal Dictionary<string, string> _hiddenFieldsToRender;
 52     private char _idSeparator;
 53     private bool _inOnFormRender;
 54     private bool _isCallback;
 55     private bool _isCrossPagePostBack;
 56     private IDictionary _items;
 57     private string _keywordsToBeSet;
 58     private NameValueCollection _leftoverPostData;
 59     private LegacyPageAsyncInfo _legacyAsyncInfo;
 60     private LegacyPageAsyncTaskManager _legacyAsyncTaskManager;
 61     private bool _maintainScrollPosition;
 62     private MasterPage _master;
 63     private VirtualPath _masterPageFile;
 64     private static readonly TimeSpan _maxAsyncTimeout;
 65     private int _maxPageStateFieldLength;
 66     private ModelBindingExecutionContext _modelBindingExecutionContext;
 67     private ModelStateDictionary _modelState;
 68     private bool _needToPersistViewState;
 69     private PageAdapter _pageAdapter;
 70     private SimpleBitVector32 _pageFlags;
 71     private Stack _partialCachingControlStack;
 72     private PageStatePersister _persister;
 73     private RenderMethod _postFormRenderDelegate;
 74     private bool _preInitWorkComplete;
 75     private Page _previousPage;
 76     private VirtualPath _previousPagePath;
 77     private bool _profileTreeBuilt;
 78     internal HybridDictionary _registeredControlsRequiringClearChildControlState;
 79     internal ControlSet _registeredControlsRequiringControlState;
 80     private ArrayList _registeredControlsThatRequirePostBack;
 81     private IPostBackEventHandler _registeredControlThatRequireRaiseEvent;
 82     private string _relativeFilePath;
 83     internal HttpRequest _request;
 84     private NameValueCollection _requestValueCollection;
 85     private string _requestViewState;
 86     private bool _requireFocusScript;
 87     private bool _requireScrollScript;
 88     internal HttpResponse _response;
 89     private static Type _scriptManagerType;
 90     private int _scrollPositionX;
 91     private const string _scrollPositionXID = "__SCROLLPOSITIONX";
 92     private int _scrollPositionY;
 93     private const string _scrollPositionYID = "__SCROLLPOSITIONY";
 94     private HttpSessionState _session;
 95     private bool _sessionRetrieved;
 96     private SmartNavigationSupport _smartNavSupport;
 97     private PageTheme _styleSheet;
 98     private string _styleSheetName;
 99     private int _supportsStyleSheets;
100     private PageTheme _theme;
101     private string _themeName;
102     private string _titleToBeSet;
103     private int _transactionMode;
104     private string _uniqueFilePathSuffix;
105     private UnobtrusiveValidationMode? _unobtrusiveValidationMode;
106     private NameValueCollection _unvalidatedRequestValueCollection;
107     private bool _validated;
108     private string _validatorInvalidControl;
109     private ValidatorCollection _validators;
110     private bool _viewStateEncryptionRequested;
111     private string _viewStateUserKey;
112     private XhtmlConformanceMode _xhtmlConformanceMode;
113     private bool _xhtmlConformanceModeSet;
114     internal const bool BufferDefault = true;
115     internal const string callbackID = "__CALLBACKID";
116     internal const string callbackIndexID = "__CALLBACKINDEX";
117     internal const string callbackLoadScriptID = "__CALLBACKLOADSCRIPT";
118     internal const string callbackParameterID = "__CALLBACKPARAM";
119     internal static readonly int DefaultAsyncTimeoutSeconds;
120     internal static readonly int DefaultMaxPageStateFieldLength;
121     private const string EnabledControlArray = "__enabledControlArray";
122     internal const bool EnableEventValidationDefault = true;
123     internal const bool EnableViewStateMacDefault = true;
124     internal const ViewStateEncryptionMode EncryptionModeDefault = ViewStateEncryptionMode.Auto;
125     internal static readonly object EventInitComplete;
126     internal static readonly object EventLoadComplete;
127     internal static readonly  
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[ASP.NETMVC3.0]ContactManager之迭代开发二发布时间:2022-07-10
下一篇:
ASP.NETWebAPI上实现WebSocketASP.NETWebAPI上实现WebSocket发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap