当首次请求default.aspx页面时会发生什么?

3

当第一次请求default.aspx页面时会发生什么?

.Net是一个纯面向对象的框架。

_default是一个扩展了Page类的类。

如果不实例化,就无法调用Pre-Init、Init和Load方法。那么_default类是如何实例化的呢?是谁负责这个过程?

我想要知道非常详细的技术步骤。

请澄清!

3个回答

5
ASP.Net框架识别请求的页面是default.aspx,并检查相应.aspx文件的标记 - 根据此生成一个基于该标记的类。该类的基类在@Page指令中确定:
<%@ Page ... Inherits="WebApplication1._Default" %>

它随后创建了该“生成”类型的实例 - 该类型继承自给定的基类,在本例中为WebApplication1._Default
ASP.Net框架通常(从未?)不会直接创建您的“代码后台”类的实例。
您可以通过调试简单的Web应用程序来亲自验证此功能:
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // default_asp NOT _Default as you might expect
        string typeName = this.GetType().Name;
    }
}

这就解释了为什么事件处理程序只需要标记为受保护的而不是公共的。
如果你非常热衷,可以使用 this.GetType().Assembly.CodeBase 获取生成的程序集路径,复制该文件并在类似 IL Spy 的工具中检查生成的类。

我已经探索了一个简单的“default.aspx”页面的IL部分。我现在非常清楚! :) - MduSenthil

1

ASP.NET页面对象模型

当请求的资源为 .aspx 时,处理程序是一个页面处理程序,即从 Page 继承的类的实例。资源类型和处理程序类型之间的关联存储在应用程序的配置文件中。
特定页面的 HTTP 处理程序类型取决于 URL。第一次调用 URL 时,将组合一个新类并动态编译为程序集。类的源代码是解析过程的结果,该过程检查 .aspx 源。该类被定义为 ASP 命名空间的一部分,并赋予一个模仿原始 URL 的名称。例如,如果 URL 端点是 page.aspx,则类的名称为 ASP.Page_aspx。但是,可以通过在 @Page 指令中设置 ClassName 属性来以编程方式控制类名。
HTTP 处理程序的基类是 Page。此类定义了所有页面处理程序共享的最小方法和属性集。Page 类实现 IHttpHandler 接口。
在某些情况下,实际处理程序的基类不是 Page,而是另一个类。例如,如果使用代码后台,则会发生这种情况。代码后台是一种开发技术,它将页面所需的代码隔离到一个单独的 C# 或 Microsoft Visual Basic® .NET 类中。页面的代码是实际创建页面行为的事件处理程序和辅助方法集。此代码可以使用

很好的信息,澄清了处理程序 -> 页面 -> Default.aspx。 - MduSenthil

1

它真的描述了这么低层次的东西吗?我相信这是众所周知的生命周期,而不是页面类构造的细节。如果我错了,而且在生命周期概述中没有找到这些细节,请纠正我。 - sll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接