现在的位置: 首页 > 综合 > 正文

Inside ASP.NET 2.0-即时编译系统

2013年05月18日 ⁄ 综合 ⁄ 共 1555字 ⁄ 字号 评论关闭

Inside ASP.NET 2.0-即时编译系统

/ 黄忠成(原文刊登于Run! PC)

ASP.NET 1.1 2.0 编译系统的进化

在笔者撰写『深入剖析ASP.NET 元件设计』一书时,曾相当深入的探讨ASP.NET 1.1 的即时编译模型, 该章节以图1 为开端, 一步步的将隐身于后的设计理念摊开在者面前,时至今日,ASP.NET即将迈入2.0 ,这个即时编译模型做相当大幅的变化, 2 是对照1.1 2.0 的即时编译模型概观,者们可以发现,2.0的即时编译模型复杂许多。 1


2



1.1 时,当访问者要求一个文件时,ISAPIRuntime(IIS 的要求处物件) 会依照文件唤起适当的Http Handler ,以.aspx 來說就是PageHandlerFactory 她也是即时编译系统的入口, 这段程在2.0 仍然没有改变,但后面的动作就完全变样,在1.1 时, PageHandlerFactory 会使用PageParser 解译.aspx 文件,再交由PageCompiler 产生出编译档案。在2.0 时,同样的动作是交由BuildManager 完成,其会呼叫适当的BuildProvider 要求的文件, 最后交由适当的Compiler 产生编译档案。者们是否看出上面这段话所隐含的意义,是的!BuildManager 具备依照同附档名使用BuildProvider 的能 这代表着设计者可能拥有撰写自订的BuildProvider 來參与即时编译程。者们可以在Visual Web Developer New Items 选项中看到图3 的画面。 3

其中最引人注意的是ASP.NET 2.0 允许使用者撰写Generic Handler 也就是1.1 中的自定Http Handler 程式档,该Wizard 会产生出程式1 的码。

程式1

<%@ WebHandler Language="C#" Class="Handler" %>
using System.Web;
public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");

}
public bool IsReusable {
get {
return false;
}
}
}

你是否看到一个介于ASP.NET Script 与一般程式档的怪程式码呢? 在存档后执时会看到图4 的结果。

4

 

问题來了 以往撰写这种自定义的Http Handler 时,设计师必须预先将程式码编译好, 放置于网站目錄下, 这个Handler 才能正常运作, 但现在并未执这个编译动作啊?那是谁为我们编译这个档案,又是如何做的呢? 答案与1.1 时相同,就是SimpleHandlerFactory 但后面的动作就 以往的SimpleHandlerFactory 只是载入对应的Assembly 启动Http Handler 2.0 时此动作换成BuildManager 她会寻找.ashx 对应的Build Provider,也就是WebHandlerBuildProvider 即时编译模型。以上的讨論說明一件事,Handler Factory 的大部份工作已经下放给BuildManager 而目的就是提供一个强大的即时编译模型,只是可以编译.aspx.ascx 还可以编译各式各样的文件,.masterpage 也是这个模型中的一员, 这带來了一个难以想象的极大优点,设计师以后将具备自定Script 文件的能,只要有需求,设计师可以自定义一种Script 语言,

抱歉!评论已关闭.