【问题标题】:How Does ASP.NET Parse Pages?ASP.NET 如何解析页面?
【发布时间】:2009-06-12 00:11:14
【问题描述】:

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

<asp:Label ID="MyLabel"><%= myObject.Text%></asp:Label>

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

【问题讨论】:

  • 您是在问如何将 Web 服务器控件呈现为 html 标签?
  • 基本上,我是在迂回地问我的问题。我正在构建一些自动从 XML 文件中读取标记并生成一些类似于带有 contorls 的 WebForm 的东西。我不知道为什么,但我通常很难解析 XML,我希望更多地了解 ASP.NET 如何解析 ASPX 页面,我将能够更好地理解如何实现我想要完成的任务.
  • 谷歌(或必应!)“asp.net 页面生命周期”。我想这就是你要找的。​​span>

标签: asp.net webforms


【解决方案1】:

“幕后”发生的事情是每个 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 页面在 Web 服务器上下文中被请求时由 ASP.NET 运行时编译。然后将编译的程序集保存在内存中,直到 a) Web 应用程序关闭或 b) 在其中一个 ASPX 文件中检测到文件系统更改,从而触发重新编译。

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

【讨论】:

    【解决方案2】:

    Reflector -> 展开 System.Web.UI -> PageParser 类 -> 反编译 -> 享用

    (对不起,不是刻薄;这是我自己能够掌握的唯一方法)

    【讨论】:

    • 哇,什么时候鼓励人们使用反光板过时了?
    • 我刚刚使用 .NET Reflector 来确定为什么 HtmlLink 标记在渲染过程中会破坏 href 值。能够窥探幕后是一个非常强大的工具,可以放在你的包里。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我需要一个LMBTFY(让我为你提供这个)。 ;P

      不管怎样,这里有一些页面:

      Compilation and Deployment in ASP.NET 2.0
      Inside the ASP.NET 2.0 Code Compilation Model

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多