Delphi7支持五种部署方式来开发Webservice,分别介绍:
Isapi是在IIS下运行;
CGI是可以在IIS和apache下运行;我自己只在iis下部署了,没试apache。
Apache 1.x需要部署到apache1的版本下;
Apache2.x需要部署到apache2;
Debugger 是可以在方便Delphi中继承调试的;
以上可以在编写完业务代码后,再根据部署环境的不同,可以单独建立项目来实现,在开发时完全一样。
以下是我在应用碰到的问题和解决方式:
<!--[if !supportLists]-->一、<!--[endif]-->首先 我以Isapi部署项目,在Xp Professor下能够运行,但不稳定,经常出现Xml不是正确的格式。其次我在windows2000 server下部署,通过浏览器可以看到提供了接口的服务,但当应用程序调用时,长时间没反应,最后没找见问题原因。这时,我不想让服务器依赖于操作系统的版本,决定放弃IIS,选择apache作为服务器;具体部署过程如下:
IIS setup
———
Goto the IIS ControlPanel…..控制面板
Rt.Click on My computer and select Manage
Expand the "Servers and applications" node
Expand the "Internet Information Server" node
Select "Default WebSite"
RightClick on "Default WebSite"
Select New–> Virtual Directory
Next
Set Alias to "EchoService"
Next
Set Directory to <DelphiPath>\Demos\WebServices\EchoService\server
Next
Check {Read, Run, Execute, Browse}
Next, Finish
From a webBrowser
Go to http://localhost/echoservice/
You should see the contents of the Server directory
Click on EchoService_CGI.exe
Expect: Default webPage
Click on the IEchoService wsdl link
(if in IE or NS6) you should now see the WSDL
<!--[if !supportLists]-->二、<!--[endif]-->第二 因为当前最新版的apache是2.2.8,因此我先建立Apache2的项目
项目的目标文件可以分为两种:一种是.dll文件,另外一种是.so文件;
请在编写完项目后,千万注意,因为delphi7的版本不能支持apache2.2,所以一定要打开你的HTTPD2.pas文件,进行如下修改
MODULE_MAGIC_COOKIE =$041503232; (* "AP22" *)
MODULE_MAGIC_NUMBER_MAJOR =20051115; { Apache 2.2.x}
MODULE_MAGIC_NUMBER_MINOR =0;
LibAPR =3D ‘libapr-1.dll’; {do not localize}
第一种:dll文件的项目
library ApacheTest; uses WebBroker, ApacheTwoApp, ApacheTestU in 'ApacheTestU.pas' {WebModule1: TWebModule}; {$R *.res} exports apache_module name 'ApacheTest_module'; begin Application.Initialize; ModuleName:=’ApacheTest_module ‘;
// Handler :=’lvyepiao2′; //该行在我的环境下要不得
Application.CreateForm(TWebModule1, WebModule1); Application.Run;end.第二种方式:so文件
Note: you can also use the Application page of the project options dialog to change the extension and prefix. The other change here was to update the default exported module record name from Project1_module, resulting in:
library ApacheTest;
uses
WebBroker,
ApacheApp, //or ApacheTwoApp
ApacheTestU in ‘ApacheTestU.pas’ {WebModule1: TWebModule};
{$R *.res}
{$E so}
{$LIBPREFIX ‘mod_’}
exports
apache_module name ‘ApacheTest_module’;
begin
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.
最后就是在apache的配置了,用文本编辑器打开apache 目录下的conf目录里面的httpd.conf, 查找LoadModule在最后一个的下面加入以下文本
LoadModule module_record_name library_name<Location /URL> SetHandler content_type</Location>
The bits you customise are:
module_record_name is the symbol exported by the project file and is case-sensitive. In Listing 2 you can see this is ApacheTest_module
library_name is taken from the ModuleName variable (from the ApacheApp unit) and defaults to the name of the shared module binary file, with any relative path needed to access it. In my example, this will be modules/mod_ApacheTest.so
URL is the case-sensitive URL portion that identifies what URLs should be serviced by the shared module. For the example, this will be /delphi
content_type is taken from the case-insensitive ContentType variable and defaults to a lowercase string that includes the module name without the extension, with -handler appended. In my example, this is mod_apachetest-handler
比如我刚才建立的项目可以在配置文件中加入: LoadModule ApacheTest_module modules/mod_ApacheTest.so<Location /delphi> SetHandler mod_apachetest-handler</Location>然后http://localhost/delphi.可以访问,表明一切正常。
然而我还有一个问题没有解决:我本来想在使用系统初始化时在
后台createThread创建并启动该线程,结果线程一运行就报错。后来不得已把该线程毙了,有知道的请帮我回复下。
<!--[if !supportLists]-->三、<!--[endif]-->第三在apache1下就简单的多了,不存在版本问题,其它的步骤跟apache2相同,那时候apache1早就出来了,支持的挺好。我使用的apache的版本为apache1.3.22,从官网上下载就可以了。
在apache1的好处就是我在apache2下不能运行的线程在这里运行跟预想的结果一致,不知道为什么?可能是2做了一些什么变动。
<!--[if !supportLists]-->四、 <!--[endif]-->第四就是调试方式的部署了,参考delphi的demo下
<DelphiPath>\Demos\WebServices\EchoService\read.txt文件中详细描述;
需要注意的是要进行调试服务器端的程序时,先设置断点后,在delphi中直接运行服务器上的程序,然后用客户端调用时就可以进行断点调试了。
WebAppDebugger Setup
——————–
First run the Server to register it
Goto Windows Explorer and run
<DelphiPath>\Demos\WebServices\EchoService\server\EchoServer_WAD.exe
Close the app
Start the WebAppDebugger
From the DelphiIDE: Tools| WebAppDebugger
Press Start
From a WebBrowser goto http://localhost:1024
select EchoService_WAD.test_app and press go
Expect: Default webPage
Click on the IEchoService wsdl link
(if in IE) you should now see the WSDL
我在实际开发和实施中不断出现问题,后面会陆续把相关的资料发布上来,以供后来参考。