使用D7做一个分布式应用的Web Service(IsApi类型),在Web service中的接口实现类中,需要调用另外一个系统提供的COM接口去完成特定的功能.使用调试环境或直接编写代码调用另一系统提供的COM,可正常运行且COM接口的系统在任务管理窗口不会同时出现两个实例.但将编译好的IsApi的Web Service分发到IIS实际的环境后,客户端调用的时候,在已经启动了COM接口系统的前提下,又会启动该系统的另一个实例,且运行一会又自动杀掉(实际调用也是这个多起的实例),不知道是什么原因?搞了几天,都不知道是什么原因,真是郁闷啊,哪位高手帮帮我?这种Web service 加 COM接口的形式应该是比较常见的啊,怎么有这种问题?代码大致如下:
procedure TFirstWS.SendSms(Const destPhone,Content:string);//对外提供的接口实现方法
var
  comObj:variant;
begin
   CoInitialize(nil);
   try
     comobj:=CreateOleObject('MSS.WSServer');//另一个系统MSS.exe提供的COM接口
     comobj.sendSms(destPhone,Content);
   finally
     CoUninitialize; 
   end;
end;如何搭建IsApi的Web Service的调试环境,参照的文档:http://bdn.borland.com/article/0,1410,23024,00.html

解决方案 »

  1.   

    ISAPI运行的用户名显然不可能是以你登录的用户名运行,所以它们不会是同一个实例。你看看你系统用户管理和IIS管理里面,是指定哪个用户运行ISAPI,就用那个用户来运行
    你的MSS.exe。。
    SHIFT+MOUSE右键===》运行方式这儿来指定运行的用户名。
      

  2.   

    楼上说的看不懂啊 我运行的MSS.exe是一个提供COM接口的程序
      

  3.   

    我知道你的MSS。EXE是一个进程外的COM程序,用来发短信什么的。。
    这种架构是可行的。。你的MSS。EXE进程实例模式也多半是一个单进程多CLIENT的COM,这也是正确的。但IIS下面运行的ISAPI,同你调试时,是属于不同用户的进程。。
    这时候COM调用是本机的进程外调用,客户端进程属于哪个用户,服务端进程也必须属于同一个用户。
    于是你就看到了两个实例。。你可以在任务管理器里面看看这两个MSS。EXE各是属于哪个用户。。
      

  4.   

    1,开启终端服务,在任务管理器中可以看到某个进程是以哪个用户名在执行。
    2,我不熟悉IIS,不过IIS应该有ISAPI执行权限与安全方面配置,比如指定某个用户名执行。。
    3,找出那个执行ISAPI的用户后,用那个用户身份执行MSS。EXE话又说回来了,,,楼主为何一定要它们在一个进程中执行呢?
      

  5.   

    找出那个执行ISAPI的用户后,用那个用户身份执行MSS。EXE???这个怎么配置
    IIS上我没有找到ISAPI执行权限与安全方面配置的地方,只有对所有的权限配置
      

  6.   

    我在任务管理器看了,两个线程起的用户名都是ADMINISTRATOR
      

  7.   

    借楼主的宝地问个问题,你的数据摸板加载正常吗,我在工程里加了Application.CreateForm(TDM, DM)输入地址后,出现打开网页错误,屏蔽了后在输入地址,显示XML文件,正常,不知何故?