您现在的位置:首页 >> 网络通讯 >> 网络通讯 >> 内容

Delphi2007开发WebService调用COM+无响应现象分析

时间:2011/9/3 15:14:45 点击:

  核心提示:最近正在Delphi2007开发一个Web Service,由于系统不仅要在Intranet中使用,还要在Internet中使用,如果服务端用COM+的话客户端的分发、防火墙的透过、安全部署等等都是非...
最近正在Delphi2007开发一个Web Service,由于系统不仅要在Intranet中使用,还要在Internet中使用,如果服务端用COM+的话客户端的分发、防火墙的透过、安全部署等等都是非常难以解决的问题,而如果单纯使用Web Service又不能使用MS SQL Server的Pooling,用户数一多的话服务器的负荷可能会很大,而且很有可能当机,如果真发生这种的情况的话,基本上这个项目就要挂了,因此在选择服务端的开发框架的问题上,决定采用Web Service加COM+的模式,由于Web Service采用的XML+SOAP+TCP的技术,可非常方便的透过防火墙,而且客户端既可以基于WinForm又可以基于浏览器的BS,便于在Internet上部署。

  但在开发过程中发现一件让我非常痛苦不已的事情。事情是这样的:

  COM+:New-->Other-->ActiveX-->ActiveX Library,先建立COM+应用程序,然后再New-->Other-->Multiter-->Transactional Data Module,建立支持事务的数据模板窗体,并这个数据窗体中加入所需的AdoConnection、AdoDataSet、DataSetProvider、ClientDataSet,AdoConnection连接到本机的SQL Server 2000,由于数据库在本机我在ConnectionString的码中选择了“使用Windows NT集成安全设置”,在OnCreate事件中设置打开AdoConnection的连接,在OnDestory中关闭AdoConnection的连接(这样也是为了使用DB的Pooling)。

  建立DUnit测试单元,测试OK!建立一个直连COM+服务器的测试客户端,测试,OK!

  建立Web Service应用程序,为了调试的方便先建立一个WAD类型的服务器,用客户端测试,OK!似乎一切都没问题!

  于是把Web Service改为CGI/ISAPI模式,加入客户端,测试,。。。。。没响应!Ctrl+F2强行退出Client,再测,又挂了,而且COM+和Web Service进程一直挂在内存中,必须重启机器或重启IIS才能退出来,再测试,再挂。因CGI/ISAPI类型的Web Service不能直接进入Debug状态,认为可能是自已某个地方写错了,重写!再一次测试!还是没响应!不信,再重写!这一次一个字符一个字符仔仔细细再检查了一遍,再测,客户端还是没响应!没道理呀,用Dunit做了测试用例,用客户端直连COM+都是好的呀!看来问题还是出在Web Service上,增加一个接口(函数),不让它连接COM+,测试,OK!晕了,客户端连接COM+,是好的,客户端连Web Service,也是好的,但是让客户端一连接Web Service中要从COM+取得数据的接口立马就挂了。难道是Web Service中连接COM+的语句写错了?但在WAD模式是测试通过了的呀!先不管,再把在客户端连接COM+中测试通过的Code拷贝过去,编译,再试,又挂了!我的天了,就这样如此这般这般如此反复,6个小时过去了,仍无头绪。

  要是Web Service能进入调试就好了,没撤,再把CGI类型改回WAD类型,测试,没问题!再测试,。。。等等,也挂了!不过WAD抛出了一个异常:“用户 'XXX-LMM\IUSR_XXX-LMM' 登录失败。”....,没在意!断续痛苦中。。。。。

  睡觉去,满脑Code,满脑的无响应画面!

  第二天,继续调试,WAD仍然抛出“用户 'XXX-LMM\IUSR_XXX-LMM' 登录失败。”的异常,想想,没道理呀,我又没用IUSR_XXX-LMM这一用户名登录数据库为什么会提示登录失败呢(XXX-LMM是我的计算机名)?而且我在COM+和客户直连COM+中都测试过了的呀!找烟、取烟、点烟,打不着火,再打,还是打不着火,换个打火机,终于点着,嘘,等等。。。终于明白了,在COM+中测试时当我们“使用Windows NT集成安全设置”时使用的用户是Windows的登录用户也就是Adminitrator用户,而这一用户正好是MS SQL Server的系统用户,当然可以登录SQL Server了,用客户端直连COM+时也是一样的道理,而当我们的客户端通过Web Service连接COM+时,COM+默认Web Service的默认用户是IUSR_XXX-LMM,而这一用户并不是SQL Server的有效用户,当然无法连接数据库了……想到这里,就一个字:“改”!果然,一切烟消云散,正常无比!那时的心情也只有一个字:爽!

  通过这一事件,对Web Service加COM+的开发模式,本人有以下几点经验值得分享:

  1、Web Service + COM+的开发模式是大势所趋,好处多多。
  2、COM+中的数据库连接(MSSQL)请千万要用Windows+SQL混合认证模式,不要认为在COM+中测试通过了就一定没有问题。
  3、AdoConnection中的KeepConnection请设为False。
  4、在COM+应尽量使用ClientDataSet的XMLData而不是Data,要不然的话就要自已EnCode64/DeEnCode64了。
  5、HTTPRIO尽量设置URL而不是WSDLLocation。
  6、在使用ISAPI类型的Web Service中,接口中要包含CoInitialize(nil);.....CoUninitialize; CoInitialize在ActiveX单元中,要包含进来。
  7、好好利用DUnit吧。

作者:小宇飞刀 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2017 版权所有 All Rights Reserved.
  • 沪ICP备05001939号