Delphi中关于ISAPI与CGI的大问题(用Delphi实现电子商务中遇到的)(200分)

  • 主题发起人 主题发起人 deem
  • 开始时间 开始时间
D

deem

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道用Delphi实现ISAPI的Web程序时存在一个大问题就是调试问题。虽然有InterBob
等调试工具,但是还是觉得麻烦。因此,比较ISAPI与CGI之间的差别发现下面的特点:
//library pro1;
program pro1;//**********************
{$APPTYPE CONSOLE} //*********************

uses
WebBroker,
// ISAPIApp,
CGIApp,//**************************
Unit1 in 'Unit1.pas' {NewsinfoWebModule: TWebModule};

{$R *.RES}
//exports
// GetExtensionVersion,
// HttpExtensionProc,
// TerminateExtension;

begin
Application.Initialize;
Application.CreateForm(TNewsinfoWebModule, NewsinfoWebModule);
Application.Run;
end.
其中用//注释的部分是ISAPI(.dll)的工程文件中生成的,而用//****************注释的则是
CGI(.exe)生成的。于是,就先用CGI方式编程(因为好调试,不像DLL运行一次就驻留内存)
等网站全部建好之后,在把所有的CGI(.exe)改为ISAPI(.exe)方式(简单地说就是把上
面用//**********************注释的部分全部注释掉,然后再把用//注释掉的语句恢复。
麻烦事来了,改成ISAPI(.dll)后原来能够运行的CGI程序现在不能运行了。浏览器端一连接
就出现了HTTP 500 - 内部服务器错误 。这是怎么回事呢?
另外,还有一个问题,就是我用Delphi做的Web网站,如果正常链接没有问题,但是我试着
连续快速点击IE上的“刷新”按钮时服务器端就不能响应了。只能把服务器重新启动才能
回复正常。我试过用ASP做的网站,无论刷新多少次,点击多快网站服务器都能正常服务。
这又是怎么会事?请各位Delphi迷们指教。
 
CGI和ISAPI是两套不同的体系,运行的机理根本不相同。你采用这种方法肯定会出问题。
重新建立ISAPI程序框架,然后将有用的程序代码拷过去。
第二个问题的原因可能是你写的WEB程序效率比较低,服务器启动需要一段时间。
 
我的作法是:先写成CGI程序,调试通过后,再新建一个ISAPI工程,然后将CGI中的WebModule单元
加入到该工程。
 
程序错了,比如说数据库连接失败等等,在web端显示的就是500内部错
 
程序在CGI方式下通过。数据库链接使用了3层结构。
 
有些东东在CGI下可用,但是在ISAPI下就会出现错误了(比如ADO)
 
可以的,我就是用CGI写好,通过了编译,再用DEEM的方法换成ISAPI,后保存,再编译,
没问题!!! 我做的www.eyems.net,还再测试中你可以去看一下,我也是做此不久。
第二个问题你可以再我的网站测一下,我觉得也不会出现阿!
 
hume:请问你是用isapi编写你的网站吗?
我刚上了你的站点设计得不错,有一疑惑想请教你,
为何在网上看到你的网页的后缀名为何是html,
而不是动态链接库(如:aa.dll/dd)
 
dana :你没有点过下一层的菜单吗??
 
这个问题我已经自行解决了。
 
多人接受答案了。
 
//change from an ISAPI dll to a CGI app

{.$define dll}

{$ifndef dll}
program Project1;
{$APPTYPE CONSOLE}
{$else}
library Project1;
{$endif}

uses
WebBroker,
{$ifdef dll}
ISAPIApp,
{$else}
CGIApp,
{$endif}
Unit1 in 'Unit1.pas' {WebModule1: TWebModule};

{$R *.RES}

{$ifdef dll}
exports
GetExtensionVersion,
HttpExtensionProc,
TerminateExtension;
{$endif}

begin
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.
 
后退
顶部