1、我现在做一个项目,要用到SOAP、Webservice、Corba,因为要求效率,我就做了个ISAPI DLL 型的Webservice程序(这个动态链接库里用到了Corba),已经编译成功生成了DLL,而且发布到了IIS下的虚拟目录下,在访问本机(http://localhost/corbawebservice/PCorbaWebservice.dll/wsdl/IIChenjieYJ)时可以看到生成接口的XML文件,但是在访问http://localhost/corbawebservice/PCorbaWebservice.dll/soap/IIChenjieYJ时,就显示出错,提示“XML文件必须要有一个顶层元素”,不知是什么问题?
2、而且我根据这个发布的接口,又用WSDL Importer做了一个客户端后,只要是访问这个接口的时候,就提示错误为“Access Violation in PCorbaWebservice.dll,Read Address 00000000”等等之类。研究了好几天,始终不得其解,请各位高手指教!

解决方案 »

  1.   

    你先测试一下你在dll的模式下数据库的连接有无问题,我也不知道在soap中和iis有无冲突!,你可以用apache的服务器试试!
      

  2.   

    应该是你用到CORBA的地方有问题,先用WAD方式调试一下看看
      

  3.   

    这种ISAPI的程序能直接转化为WAD的吗?Raptor兄
      

  4.   

    可以,新建一个WAD应用,把WAD里的PAGE(不是FORM,别搞错了)删除,然后把ISAPI里的所有PAGE加进来即可。
      

  5.   

    1、只要能生成WSDL一般没有问题,你只要用WSDLImport导入接口即可访问,如出现你说的错误,应该是URL不正确
    2、只有DEBUG才能知道了
      

  6.   

    Raptor(猛禽)兄,我的URL没有错误,不过这不是主要问题,毕竟WSDL Importer可以成功生成文件。主要是第二个问题,为什么总是运行不了,我仔细翻阅了李维的书,的确是找不出是哪里的错误。可能因为我一直看自己的代码,已经看不出来什么问题了吧,如果仁兄有时间,能帮我看看程序(代码很简单),我将不胜感激。现贴出部分代码:
    1、在WebModule里加了个ONCreate事件:
    procedure TCorbaWebModule.WebModuleCreate(Sender: TObject);
    var
      i:integer;
    begin
      CorbaInitialize; //Corba初始化
      try
        YJSignal:=TCJSignalCorbaHelper.Bind('WUST_CJSignalObject');
        //定义并绑定Corba对象
      except
        Exit;
      end;
      //设定两个存放数据的二维数组的大小
      SetLength(SampleSignal,32);
      for i:=0 to 31 do
        Setlength(SampleSignal[i],81920);
      SetLength(FeatureSignal,6);
      for i:=0 to 5 do
        SetLength(FeatureSignal[i],6);
    end;
    2、在Intf文件里声明接口函数
        function SendSamplesignal(MySampleIndex:Smallint):TDoubleDynarray; stdcall;
        function SendFeaturesignal(MyFeatureIndex:Smallint):TDoubleDynarray;stdcall;
        function SendSamplePoint:Integer;stdcall;
        function SendFrequence:Integer;stdcall;
    3、在Impl文件里定义接口函数,此文件里包含WebModule文件,应该没有问题。
       请大虾们帮忙看看我的代码到底是哪里有问题咯,多谢先!
      

  7.   

    >3、在Impl文件里定义接口函数,此文件里包含WebModule文件,应该没有问题。正是这里出问题了,因为DELPHI的WEBSERVICE的实现机制决定了,INTFIMPL和WEBMODULE是完全隔离的(具体实现我还没搞清楚),即不能在IMPL中引用任何WEBMODULE的部分,反之亦然。我想你是想做一个有状态的东东,在WEBMOD中创建一些东东供INTFIMPL使用,但很不幸,DELPHI的WEBSERVICE不支持这样做,首先因为SOAP协议本身是一个轻量的协议,是一个完全的Request/Response实现(跟HTTP一样,所以才能方便地用HTTP实现--即WEBSERVICE),它不要求某次SOAP调用依赖于上次的调用。解决这个问题有一个办法:改用SOAPDataModule。它提供了一个有状态的解决方案,当然也比标准WEBSERVICE笨重许多。
      

  8.   

    但是好象C++Builder可以这样处理的。这是什么原因呢?
    而且改用SOAPDataModule的话,这模块里面又应该加些什么控件,具体又应该怎么实现呢?难道它就可以这么互相引用吗?
      

  9.   

    CB应该也是不行滴因为IMPL的实例是每次调用请求时重新创建的,而WEBMODULE的实例则是根据应用的不同而不同,二者不能直接互访。SOAPDATAMODULE不是一般的DATAMODULE,而是一个特殊的接口实现,它也和IMPL实例一样是在每次客户端调用请求时创建。我刚看了你发来的程序,
      YJSignal:CJSignalCorba;
      SampleSignal,FeatureSignal:DoubleArray;
      samplepoint,frequence:integer;
    这三个作为全局变量也是有问题滴,IMPL的实例是多线程的,可能造成访问冲突。
      

  10.   

    访问http://localhost/corbawebservice/PCorbaWebservice.dll/soap/IIChenjieYJ出错?你一定是直接在浏览器中输入这个地址了。soap项不是这么用的,还是好好看看书吧。
      

  11.   

    我看了你发来的CB代码和D的代码,的确看不出分别,我也不知道为什么会这样VisiBroker偶也不是很熟,BCB中的:
           CORBA::ORB_var orb = CORBA::ORB_init(__argc, __argv);
           CORBA::BOA_var boa = orb->BOA_init(__argc, __argv);  
    是不是相当于DELPHI中的:
      CorbaInitialize;
    ?如果是的话,应该没有什么区别了。我这里没有环境(你的那些CORBA的东东),没办法帮你调试,你最好自已按我前面说的,把它改成WAD应用再调试一下看看。估计还是出在CORBA的什么地方。“XML文件必须要有一个顶层元素”一般最常出现的ISAPI出错(比如异常)的情况,反回了一个500出错页面(HTML,不是XML),所以会报这个错。还有我上一贴说的线程访问冲突是一个需要考虑的问题,建议你还是改一下,以避免这种问题。你那个BCB虽然可以执行,但要考虑到以后可能出现的的并发访问,那时它可能就会有问题了。
      

  12.   

    请问你的第一个问题是如何解决的???
    我也碰到了同样的错误,提示“XML文件必须要有一个顶层元素”,
    我用WAD 调试正常,用ISAP就出错,是按照李维的例子试的