当前位置:Linux教程 - Linux综合 - ATL Server 与 ASP.NET

ATL Server 与 ASP.NET

  Web 服务器的任务就是接受传入的 HTTP 请求,并返回一些对呼叫方有用的信息(不论呼叫方是人,或者是 Web 服务时的机器)。Windows 包含有处理请求的成熟结构 — IIS 及其相关扩展。但是,从头开始设计 IIS 是很单调乏味的,并且容易出错。管理 HTTP 请求的一种较好的方法就是利用位于 IIS 顶部的一种框架来管理。本月我将比较两种创建 Windows Web 应用程序的主要技术:Asp.Net 与 ATL Server。每种框架都有一些特定的优缺点。在本部分,我将集中讲述如何用 ASP.NET 管理基于 Web 的 UI。下次我将集中讲述如何利用这两种框架来构建 Web 服务及其它功能。    ASP.NET 究竟是什么?  ASP.NET 是为处理 HTTP 请求而设计的类库。除了类库,ASP.NET 还包含几个管理请求的 IIS 组件。这些组件包括名为 ASPNET_ISAPI.DLL 的 ISAPI DLL 以及名为 ASPNET_WP.EXE 的辅助进程。ASP.NET 还在 IIS 中安装了新的映射,将 ASPX、ASCX、ASHX 和 ASMX 的文件请求重定向到 ASPNET_ISAPI.DLL。至此,ASPNET_ISAPI.DLL 将请求定向到 ASPNET_WP.EXE,在该进程中,ASP.NET 加载所需要的类来为请求提供服务。    以名称为 HttpContext 的托管类为中心,ASP.NET 有一个很方便的对象模型。如果您曾经写过一个标准的 ISAPI DLL,那么您一定了解包含于 EXTENSION_CONTROL_BLOCK 中并传递给 ISAPI DLL 的 HttpExtensionProc 的信息。管理请求时,ISAPI DLL 对该结构进行检查,以获得诸如环境 ID、查询字符串,以及读写客户端的函数等信息。ASP.NET 将所有这些信息都包装在 HttpContext 类中。ASP.NET 还包括管理基于 Web 的 UI(通过 System.Web.UI.Page 类)以及管理 Web 服务(通过 System.Web.Services.WebService 类和 [WebMethod] 属性)的基本类结构。    ASP.NET 是面向对象的。每个通过 ASP.NET 应用程序传递的请求都由名为 IHttpHandler 的类来处理,该类可以实现接口。这样就造就了一种扩展性很强的体系结构。您可以选择利用 ASP.NET 页体系结构或 Web 服务体系结构,或者,您还可以从头编写处理逻辑。图 1 显示了 ASP.NET 请求采取的路径。      ASP.NET UI-处理体系结构以 Web.UI.Page 类(由 ASPX 文件表示)为中心。ASPX 文件可以包括整齐的 Html 代码及服务器端控件。当 ASP.NET 遇到一个服务器端控件时(通过“runat=server”属性),它就实例化了一个表示该控件的类(例如,Button 和 ListBox 控件)。本质上,ASP.NET 页作为这些服务器端控件的树来处理(该页上的文本和标记被打包为 LiteralControl 类)— 其它的都是服务器端控件。当要求呈现该页自身时,该页只是遍历该控制树,“告诉”树上的每个节点呈现它们自身。ATL Server 的运作方式有些不同。    ATL Server 有何不同?  ATL Server 是一个用来创建 ISAPI DLL 的 C++ 模板库。当第一次创建 IIS 时,开发人员必须从头或从 MFC 的 ISAPI DLL 类作为起点来编写 ISAPI 扩展。利用原始的 C++ 或 MFC 代码生成 ISAPI DLL 需要人工编写扩展代码。例如,MFC ISAPI 没有为开发人员提供基于窗体的体系结构。任何在客户端结束的 HTML 标记都必须由人工来发出。    ATL Server 将基于窗体的方法与运行时速度以及 C++ 的灵活性结合起来。利用 ATL Server 构建的 Web 站点由三个基本组件构成:服务器响应文件 (SRF)、应用程序 DLL 以及必备的 ISAPI 扩展。SRF 是 ATL Server 安装在 IIS 中的一种新型文件。SRF 映射将 IIS 指向应用程序的 ISAPI DLL,这反过来又将处理指向一个或多个应用程序 DLL。SRF 包括一种特殊的新的标记语法,它本质上是在应用程序 DLL 中调用入口点。图 2 显示了基于 ATL Server 的请求通过系统时所采用的路径。     ATL Server 应用程序由许多 DLL(ISAPI 扩展和应用程序扩展)以及被称为 SRF(前面提到过)的 HTML 生成模板组成。这种体系结构很清楚地将应用程序表示和应用程序逻辑分离开来。网页的表示由包含 HTML 和特殊标记的 SRF 来定义。这些标记调用 ATL Server 应用程序 DLL。    由于大多数 Web 应用程序的目标平台是 Windows,因此 ATL Server 应用程序要构建于 ISAPI DLL 之上。ATL Server 项目包含可处理粗略请求的单个 ISAPI 扩展 DLL。ATL Server 应用程序还包含用于多种精确请求处理的一个或多个应用程序 DLL。处理请求的类派生于 CRequestHandlerT,并且还包含您自己特有的、用来处理 SRF 中标记的代码。    这些处理程序类包含将请求处理程序类和请求处理程序 DLL 关联起来以及将替代方法与 SRF 标记关联起来的字典。除了替代字典外,CRequestHandlerT 还包含访问标准 Web 应用程序元素的方法和成员变量,例如窗体变量、cookies、请求流以及响应流。    当浏览器通过 HTTP 找到 .srf URL 时,IIS 知道用 ATL Server 应用程序的 ISAPI DLL 来打开站点。ATL Server 应用程序随后打开 SRF,并加载该应用程序的 DLL(如果它们还没有加载的话)。该应用程序随后将请求传送到默认的请求处理程序类,该类对 SRF 进行分析,以寻找有特殊记号的标记。每次在 SRF 中出现标记时,应用程序就调用存在于某应用程序 DLL 中某个处理程序类的替代方法。该替代方法动态生成浏览器的输出。图 2 显示了通过 ATL Server 应用程序的请求的路径。    ATL Server 与 ASP .NET  虽然 ATL Server 和 ASP.NET 都基于 ISAPI 体系结构,但是它们处理请求有很大不同。为了说明这些不同点,让我们看一个应用程序示例,该应用程序收集个人姓名和他(或她)的开发偏好。我将说明如何开发用户界面以及如何使用会话状态。在本专栏的下一部分,我将考察其他的一些功能(例如缓存和浏览器的能力),以及每种框架上 Web 服务的工作原理。图 3 对比了两种框架的一些功能。    ASPX 文件与 SRF  ASP.NET 和 ATL Server 为 ISAPI 体系结构引入了新的文件扩展名。ASP.NET 引入的文件类型有 ASPX、ASMX、ASCX 和 ASHX,还有一些其它类型。在 ASP.NET 框架中,这些文件类型中的每一种都有一个对应的托管类。对于 ASPX 文件来说,这样的类就是 System.Web.UI.Page。该 Page 类负责呈现基于 UI 的网页。图 4 显示了一个简单的 ASPX 文件。    关于 ASPX 文件要注意的主要事项就是,网页顶端附近的继承指令以及按钮、标签和下拉列表标记的“runat=server”属性。这些标记表示了服务器端控件在 Visual Studio 中的代码隐藏文件中对应的类。    相比之下,SRF 包含了最标准、最普通的 HTML 标记。ATL Server 没有服务器端组件体系结构。但是,它确实引入了服务器响应标记的概念。这些特殊的标记用双大括号 ({{}}) 表示。当 ATL Server 请求体系结构遇到一个服务器响应标记时,它期望在应用程序 DLL ÖÐ找到一个对应的处理程序函数。图 5 显示了一个简单的 SRF,它显示的用户界面与图 4 ASPX 示例中的用户界面大致相同。    本文件中需要注意的最重要的事项是由双大括号括起来的特殊标记。例如,在 SRF 的顶端附近,您会看到指定应用程序默认处理程序的处理程序标记 ({{handler...}})。这会告诉 ATL Server 应用程序加载哪一个 DLL,以找到由响应标记调用的函数。其它的响应标记指出应用程序 DLL 中的入口点。     “固有”对象  ASP.NET 和 ATL Server 都包含有类似的固有请求和响应对象,这和典型的 ASP Ò»Ñù¡£在 ASP.NET 中,它们用 HttpRequest 和 HttpResponse 类来表示。在 ATL Server 中,它们用 CHttpRequest 和 CHttpResponse 类来表示。在每种框架中,它们的用途基本相同。请求对象封装了诸如请求参数和请求 URL 等项。响应对象包含有向客户端输出文本的功能。例如,为了向某个基于 ASP.NET 请求的输出流插入“Hello World”,只需要调用 Response.Write 即可,如下所示:    protected void HelloWorld()  {  Response.Write("Hello World");  }    为了向基于 ATL Server 应用程序的客户端输出“Hello World”,使用 CHttpResponse 对象,如下所示:    [tag_name(name="Hello") ]  HTTP_CODE OnHello(void) {  m_HttpResponse

(出处:http://www.sheup.com)


上一页 [1] [2]