Borland 在 Delphi/C++ Builder 中提供了多种类型的 Web 应用开发,其中最常用的应该是用于调试的 Web App Debugger 应用(WAD应用)和在 Windows/IIS 平台下运行的 CGI/ISAPI 。虽然从理论上说,这几种类型的 Web 应用程序除了类型不同以外,应该没有什么太大的区别。即一般情况下,可以很容易改变其类型,如:假设有一个调试好的 WAD 应用,只要新建一个空的 ISAPI 应用,然后把 WAD 应用中的必要单元加进来编译一下即可生成一个同样功能的 ISAPI 应用。但不幸的是,事实并非如此,这几种类型的 Web 应用之间的有一些必须关注的区别。
那个问题出在数据库访问控件和 DataModule 上。在那个例子中,我是把数据访问控件放在 WebModule 中,这在 WAD 中是没什么问题的,但在 ISAPI 中却有问题,这与这两种类型的程序执行过程不同有关。另一个则是关于 DataModule 的,在 WAD 中增加一个 DataModule 来放数据访问控件是没什么问题的,但在 CGI 中却会出现程序不执行的情况(即出现下载文件的提示或出错),在 ISAPI 中则出现 AV(Access Violation) 错误。
所以本文将从这几种类型的 Web 应用程序的执行过程分析来看看它们的区别。
分析 WAD 类型的源程序得知:每个 WAD 应用都会用 TWebAppAutoObjectFactory 创建一个 Automation 对象,当 WAD 收到一个发给此 WAD 应用的 Web 请求时就会用 GetActiveObject 来调用一个运行中的实例,如果没有实例在运行就启动一个。一旦取得运行中的 WAD 应用实例就通过此 Automation 对象的接口把 Web 请求发过去,由此 Automation 对象调用 WebModule 来模拟真实的 Web 服务器。之后的执行是一般 Web 应用必要的过程。在 Automation 对象被释放时(如引用计数减为0时),同时释放 WebModule 等。即在整个 SOAP 请求期间,WebModule 都是可用的。
CGI 是作为 Web 服务器外部的一个进程单独运行,它是一个标准的控制台程序,只是 Web 服务器把 Web 请求重定向到 CGI 程序的标准输入,而把 CGI 程序的标准输入重定向到 Web 响应。但是 Borland 在编译处理时可能有一些特别做法,即当程序中有 DataModule 时会把它编译为非 Web 应用,使这样的 CGI 程序在 IIS 中不能运行(即在浏览器中输入其 URL 时将出现下载对话框)。所以,必须在处理请求时动态创建 DataModule 才行。因为 CGI 是根据每个 Web 请求创建实例的,所以当请求响应返回, CGI 程序也就结束了,此时才释放 WebModule ,所以实际上在整个 SOAP 请求期间,WebModule 都是可用的,这一点跟 WAD 应用一样。
实际上, ISAPI 应用是在第一个请求到达 Web 服务器时就被启动(此时创建 WebModule ),此操作在 ISAPI 的入口: DllEntryPoint 函数中实现。请求处理结束后, ISAPI 应用仍存在于内存中,包括 WebModule 也是。 Web 服务器为每个请求创建一个 Worker Thread 来处理,处理完成只是终止 Worker Thread 。即在处理请求时是在 Worker Thread 中,并不与 WebModule 在一起,特别是 IIS 可以用 dllhost.exe 来调用 ISAPI ,使它在独立的进程空间中运行(这种情况下不执行 DllEntryPoint),所以在处理请求时无法访问 WebModule 及同时创建的 DataModule (如果有的话),如果在处理请求时用到它们就将出现 AV 错误。所以在 ISAPI 中,不能使用全局的 DataModule ,只能动态创建。
解决 DataModule 的问题还有一个办法,那就是用 SOAP Server Data Module 来代替 DataModule 。为什么这样是可以的?因为 SoapDataModule 其实只是一个从 IAppServerSOAP 派生的接口,在每个请求处理时会自动创建相应的实例,可以省去手工动态创建 DataModule 的麻烦。但它也有一个问题,那就是在 WSDL 中多了很多不必要的接口: IAppServer/IAppServerSOAP 等,同时,如果在其中放了 DataSetProvider 的时候,会把不必要导出的表导出了。特别是用了 dbExpress 的情况,此时尽可能用 SQLClientDataSet 来代替 SQLDataSet + DataSetProvider + ClientDataSet 组合。
相关推荐
纯Delphi开发CGI
<br />------------------------------------这是以前写下的---------------------------------------<br /> <br /> <br /> <br />在JAVA泛滥、ASP.net 漫山遍野的今天,也许,大家认为CGI是一种落后的技术,但,也许大家有所不知的是CGI是一种效率很高的编程方式。因为,在前端,CGI不用面对复杂的网络请求过程,而后端输出,又是可以直接输出给浏览器。<br /><br /> 宝刀未老的PERL,是CG
Web 应用的执行过程 -- 谈谈 WAD/CGI/ISAPI 的区别
Web 应用的执行过程 -- 谈谈 WAD/CGI/ISAPI 的区别 Borland 在 Delphi/C++ Builder 中提供了多种类型的 Web 应用开发,其中最常用的应该是用于调试的 Web App Debugger 应用(WAD应用)和在 Windows/IIS 平台下运行的 CGI/ISAPI 。虽然从理论上说,这几种类型的 Web 应用程序
BCB调用WebServers接口
BCB通过WSDL Importer调用WebServers接口文档说明,有图片详细介绍,例子是腾讯QQ是否在线状态判断。
教程篇(6.4) 10. Web过滤 ❀ 企业防火墙 ❀ Fortinet 网络安全架构师 NSE7
In this lesson, you will learn about web filtering. 在这节课中,你将学习关于web过滤的知识。 After completing this section, you should be able to achieve the objectives shown on this slide. 完成本部分后,你应该能够实现这张幻灯片上显示的目标。 By demonstrating competence in web filte...
教程篇(7.0) 06. 零信任网络访问ZTNA ❀ FortiClient EMS ❀ Fortinet 网络安全专家 NSE 5
在本课中,你将了解零信任网络访问(ZTNA)。
用Delphi编写CGI程序(一)
用Delphi编写CGI程序(一) 1.0 、 CGI 程 序 的 功 能: 首 先, 什 么 是 公 共 网 关 接 口( CGI ) 呢? CGI 是 一 个 用 于 定 义 WEB 服 务 器 与 外 部 程 序 之 间 通 信 方 式 的 标 准, 使 得 外 部 程 序 能 生 成 HTML 、 图 象 或 者 其 他 内 容, 而 服 务 器
C++ Builder 6 BizSnap/SOAP/WebService(2) -- 通过 SOAP 传递自定义类型数据(改)
说明:本文经过一些改动,纠正了一些问题,因为原文无法修改,只好重发。不久前我收到几位朋友发来Mail说明他们在按照本文所述进行WebService应用开发时碰到的一个问题:在用ISAPI方式编写本文例子程序时发生AV错误。根据改进后的本例子程序修改了本文,请注意文中加粗部分内容。--2002-8-17 本文将做一个略复杂的例子,实现通过 SOAP 传递自定义的数据类型。本例子的
如何设置 IIS 用以运行Delphi 编译的 CGI 程序
结合一些好的前端库,可以很简单地作出非常漂亮功能强大的基于 WEB 页面的程序。具体做法这里就不细说了。在 Delphi 里面新建一个 Web Server 的工程,选择 IIS CGI 以后,这个工程编译出来的就是一个 Windows 的 Exe 可执行文件,它就是可以在 IIS 底下被 IIS 调用的 CGI 程序。额外说一句:Delphi 还可以编译出。
apache下部署delphi写的cgi
1.安装好apache服务器。 2.将cgi(一般是exe)拷贝到cgi-bin文件夹改后缀为cgi. 3.访问http://xx:port/cgi-bin/cgi-name.cgi 这样就可以了。
如何在Delphi6中调试web程序步骤
1.新建一个web工程,请选中最下面一项:Web App Debugger executable,Coclass name我们设为demo1; 2.在弹出的WebModule2中右击,在弹出的Action编辑框中新建一个webaction,选中,设置Default属性为True,在其onaction事件中编写如下代码,输出一个仅显示‘hello,dephi!’的html页; 3
BCB通过WSDL Importer调用WebServers接口
BCB访问WebServers接口 1. 打开编译器 File->new->Others-> 2. 3. 选择WebServers选项 4. 双击 WSDL Importer选项 5. 6. 输入链接这里输入腾讯QQ状态查询链接http://www.webxml.com.cn/webservices/qqOnlin
用Delphi编写CGI程序(六)
用Delphi编写CGI程序(六) 在 前 面 的 几 个 章 节 里 , 我 们 完 成 了 CGI 程 序 的 一 般 论 述 。 在 此 , 我 给 出 一 个 简 单 的 示 范 程 序 作 为 对 以 前 的 内 容 的 总 结 。 要 使 用 这 个 程 序 , 您 需 要 OmniHTTPD 的 最 新 测 试 版 : OmniHTTPD
Delphi调试CGI或ISAPI
因为dll文件已驻留内存,可用intrabob进行调试,也可用PWS进行调试,不过要换文件。 IntraBob是资深程序员Dr.Bob编写的免费工具软件,用于测试Delphi编写 的CGI/WinCGI/ISAPI程序,它可以代替PWS/IIS等WWW服务器软件, 调试本地的CGI/WinCGI/ISAPI程序,其原理是模拟PWS/IIS接受WWW请求, 并根据您的设置将类
IIS7 CGI 的设置 -- IIS 下运行 Delphi 编译的 CGI 程序
修改 IIS7 设置如下,参考了 Dr. Bob 的:http://www.drbob42.com/examine/examinC3.htm IIS7 安装完后,不能运行 Delphi 编译的 CGI exe 程序。需要做如下设置: 1. 在 IIS7 的管理器里面,选择左边的最顶层的电脑,而不是电脑下的网站,右边才会有 “ISAPI 和 CGI 限制”这个图标。点开,添加一个 C
用Delphi编写CGI程序(二)
用Delphi编写CGI程序(二) 在 上 一 讲 中, 我 们 介 绍 了 CGI 程 序 的 功 能。 今 天, 我 们 进 入: 第 二 部 分、 CGI 程 序 设 计 的 概 念 。本 讲 的 内 容 是 深 入 了 解 CGI 程 序 的 基 础。 本 系 列 讲 座 是 用 Delphi 编 写 CGI 程 序, 对 于 本 次 的 内 容 Del
delphi + apache + cgi 最简单的例子
一. apache 配置,这个就不说了,网上很多二. 建立测试程序首先,建立 webServerApplication 然后一定要在事件里面添加一个返回,地址栏调用:http://localhost/cgi-bin/Project1.exeOK....
WAD的条件清单
如下图左边报表,因为Category太多了,而且名字也长,它根本就不显示,从某种角在度来说这份报表就没意义了。 那怎么做得有意义呢?让用户自己决定,用户想显示什么就自己定义条件,如只想显示总数前十位的公司数据。 在WAD中“插入”---->“Web项目”---->“混合”----->“条件清单”。进行数据绑定的设置。 运行这份报表时,条件清单的控件就如上图左上角, 用户进行对关键
用Delphi 制作Web 数库服务系统
Web数据库服务系统包括一个Web浏览器作为用户界面,一个数据库服务器用作信息存储和数据采集,一个连接两者的Web应用服务器,Web应用软件出色地将数据陈述标准化,DBMS则组织和标准化数据库的接收与存储,Web浏览器通过TCP/IP与Web服务器相连,将页面请求与输入的数据发送给Web服务器,Web应用服务器把来自Web浏览器的请求转化为数据库服务器能接受的形式(SQL),传给数据库服...
4205




被折叠的 条评论
为什么被折叠?



