ASP.NET如何解析页面?

sen*_*nfo 2 asp.net webforms

我正在寻找一篇文章,深入探讨ASP.NET的工作原理以及它如何从XML标记中呈现控件.例如,在幕后,ASP.NET如何采用以下标记并让它产生我们看到的结果?

<asp:Label ID="MyLabel"><%= myObject.Text%></asp:Label>
Run Code Online (Sandbox Code Playgroud)

有没有人知道任何会深入探讨ASP.NET内部工作的文章?

Rex*_*x M 6

"引擎盖下"发生的是每个ASP.NET页面都被编译成.NET类,就像其他任何一样.控件(ASCX)以相同的方式编译.有一个用于ASP.NET标记的编译器就像c#和VB.NET的编译器一样 - 您可以将ASP.NET标记视为编译为本机MSIL的"另一种"语言.

本机ASP.NET标记由PageParser处理.您可能会注意到这个类有一个有趣且非常有用的方法 - GetCompiledPageInstance.正如它所暗示的,它将页面编译为本机.NET类.这可以被覆盖(例如,你可以提出自己的标记并编写自己的解析器/编译器).Spark是ASP.NET标记的流行替代品.

每个类最终都继承自PageControl.这两个类都有Render()方法,在类执行其实现的自定义功能的最后,将HTML写入输出流.

最大的区别在于编译通常发生在与c#或VB.NET代码不同的时间.这不是真正的技术要求,因为它是一种允许将表示.NET语言与功能.NET语言分离的功能.ASPX和ASCX页面是在ASP.NET运行时在Web服务器的上下文中请求时编译的.然后将编译的程序集保存在内存中,直到a)Web应用程序关闭或b)在其中一个ASPX文件中检测到文件系统更改,从而触发重新编译.

可以在您的c#/ VB.NET /之外编译 ASPX页面,因此您可以将整个应用程序部署为单个程序集.这有两个优点 - 一个是部署单个DLL的明显简易性.其次,它消除了LOOOONG等待时间,这通常伴随着对ASP.NET Web应用程序的"第一次打击".由于所有页面都是预编译的,因此只需在第一次请求时将程序集加载到内存中,而不是编译每个文件.