捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
Delphi2007开发WebService调用COM+无响应现象分析
关键字:WebService调用COM+无响应现象分析
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:高级 完成时间:2008/5/1
发布者:xieyunc 发布时间:2008/5/1
编辑器:DELPHI7 语  种:简体中文
分 类:对象 下载浏览:1231/11342
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
  最近正在Delphi2007开发一个Web Service,由于系统不仅要在Intranet中使用,还要在Internet中使用,如果服务端用COM+的话客户端的分发、防火墙的透过、安全部署等等都是非常难以解决的问题,而如果单纯使用Web Service又不能使用MS SQL Server的Pooling,用户数一多的话服务器的负荷可能会很大,而且很有可能当机,如果真发生这种的情况的话,基本上这个项目就要挂了,因此在选择服务端的开发框架的问题上,决定采用Web Service加COM+的模式,由于Web Service采用的XML+SOAP+TCP的技术,可非常方便的透过防火墙,而且客户端既可以是基于WinForm的CGI又可以是基于浏览器的BS,便于在Internet上部署。

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

  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吧。
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论4条 当前显示最后4条评论
fengjiwei 2008/5/23 9:24:41
这种技术架构俺以前也用过,而且也开发成功了一个很大的项目呢。参照李维的那个关于Web Service的书,呵呵,相当的有用。

感谢楼主为大家分享自己的开发心得,让俺又一次回味以前的艰辛,谢谢!
idoudo 2008/5/23 12:26:06
哎 连 什么是com+都不清楚……  没有 具体的 项目;学起来 就是个 累字;
chatop 2011/3/21 13:06:56
确实容易疏忽的一个问题。谢谢分享。
ginger 2019/4/7 13:57:24
楼主你好,遇到一个 webservice和com+ 一起用的问题,楼主能否私信个联系方式
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表