(高分求解)通过http(httpsrvr.dll)协议连接应用服务器有重大问题: (200分)

大文

Unregistered / Unconfirmed
GUEST, unregistred user!
本人用 webconnection 组件通过 http 协议连接应用服务器时遇到如下问题。
1、客户通过 http协议连接至应用服务器时(http://xxx.xxx.xxx.xxx/script/httpsrvr.dll)
一切操作正常(包括查询、增加、删除、修改等),但当客户端和服务器正常断开后,服务器为
该客户端产生的实例却不能自动卸载(之前我一直以为这是iis 的 object polling技术),当
第二、第三、第四个客户连接上来后同样服务器给每个客户端建立一个连接,而当这些客户端全
部都断开后,服务器端却保留了 n 个服务对象的实例(在任务管理器里可以看到有 n 个应用
服务器程序的实例),点解?。
2、如果应用服务器先启动,然后用客户端通过(http://xxx.xxx.xxx.xxx/script/httpsrvr.dll)
和服务器连接时,httpsrvr.dll 不能自动的和现有的应用服务器实例相连而是通过IIS 默认账号
重新启动一个应用服务器实例,且有多少个用户连接就起多少个实例,难道是DELPHI7的问题??
3、webconnection 的如果通过 SSL 加密,这点好像没有太多的帮助,如果用在服务器端实现SS加密,
服务器方是否直接用IIS的加密方法,如何实现(最好提供一个.DLL实现的例子而不是 CA 认证)?
4、httpsrvr.dll能否工作在 APACHE 下,APACHE 是否支持COM/DCOM?
5、以上问题本人愿高分求助,每个300决不食言,如有精彩回答者,另高分相送。

 
我也发现TWebConnection就些问题,但和你的不太一样。先来说说你的:
1、我并没有发现在客户端在完成了组件方法的调用并退出后,服务器的实例不会释放的现
象。我使用的是COM+进程内组件,换句话说,当启动一个新的应用服务器实例的时候,在我
的任务管理器里会看见出现一个dllhost.exe的实例,当多个客户端调用(不管客户端是通过
TWebConnection或其它方式调用的)时,我都不会在任务管理器中看到更多的dllhost.exe
的实例。
2、和你的情况相反,如果我在使用TWebConnection连接服务器前应用服务器没有启动的话,
连接将失败——与使用TDCOMConnection或直接调用接口不同,服务器不会被自动激活,难
道这是httpsrvr.dll的问题(我用的是CB6自带的)?但总的来说不会出现实例重复启动的
情况。得看看你的应用服务器是采用什么方式建立的,是进程外组件(.exe)吗?
4、如果是Windows下的Apache,我想是可以使用httpsrvr.dll的。Apache是否支持COM/DCOM?
这话是怎么说的?在Apache支持httpsrvr.dll的情况下,与COM的交互是由后者来完成的。
确切地说应该是是否支持ASP吧?我没有深入研究过,不敢妄下结论,但考虑到Windows下的
Apache如果要和其它平台下的保持版本一致性的话,应该是不支持的吧。
 
2.
我用的是delphi默认的方式,但是应用程序采用 socket 和 dcom连接却完全没有上述问题存在。
 
什么叫“默认的方式”?
在建立项目时选的是哪一个向导?Automation Object? Transactional DataModule?
Remote DataModule?
编译后生成.exe文件还是.dll文件?(.exe文件的是进程外组件,.dll的是进程内组件,我
在上一贴中的有笔错,更正)
 
谢谢关注:)
Remote DataModule方式
编译后生成的文件是 .exe类型。
 
我看是你的系统的问题吧,刚才我新建了一个程序,是用Delphi 6建立的应用服务器(跟你用
的是同样的方法),CB6做客户端,用TWebConnection连接应用服务器,结果完全正常,跟
我先前的描述类似:不量有多少个客户端,在任务管理器里都只看得到一个应用服务器的
实例,当所有客户端都关闭后,应用服务器的实例也就释放了。
我认为即使是不同版本的Delphi(或CB)都不用应该出现应用服务器实例不能释放的问题,
这是一个很基本的要求,Borland是不会范这个错的,该不是你往应用服务器里加了些额外
的功能导致的吧?我的应用服务器里可是一行代码都没有(进一步说,即使有代码也不会出
这样的问题)。
如果还是不能解决,考虑重装一下操作系统吧。
 
问题是,该应用服务器实例是由IIS以DCOM方式自动启动的,这点我无法控制。
此问题出现在多台机器上,分别为WINDOWS 2000 ADV SERVER,WINDOWS XP。
 
两点建议:
1.线程模式选用Neutral
2.在RemoteDataModual单元中加两行代码:
a. 在EnableWebTransport(ClassID);之后加上RegisterPooled(ClassID, 5, 5);
b. 在DisableWebTransport(ClassID);之后加上UnregisterPooled(ClassID);
注:RegisterPooled的后两个参数的意义:
a.缓冲池的大小,既最多开多少个RDM实例
b.释放的延时,既每个实例在空闲多长时间后释放.
 
总算有人关注了,太太太感谢了,先试试看,如有效果,分历马给。
 
虽然未能解决问题,也谢谢各位!
 
LeeChange的方法不行的,这个问题我也有遇到,始终无法解决。
据我的观察,应该是windows的问题,理由如下:
在某些机器上,产生多个实例之后(其实其中只有1个是活动的,其它的都是死的),
可以在任务管理器里删掉那些死掉的进程,但是有些机器上不能删除,会提示无法访问。
最有意思的是,公司里有1台机器上不会出现多个实例的这种情况,在任务管理器里总是
只有一个实例,后来我重装这台机器后就和其它的一样了,会出现多个实例。而其它的机
器不管我如何重装,总是会有多个实例。
所以我感觉是windows的问题。
 
多谢各位了,就让这个问题成为疑难杂症吧。
 
顶部