哪位做过ISAPI DLL型Webservice程序的高手,请帮忙看看我得程序出了什么问题?

tresa 2003-10-16 10:03:42
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”等等之类。研究了好几天,始终不得其解,请各位高手指教!
...全文
113 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
DrylandFish 2004-03-21
  • 打赏
  • 举报
回复
请问你的第一个问题是如何解决的???
我也碰到了同样的错误,提示“XML文件必须要有一个顶层元素”,
我用WAD 调试正常,用ISAP就出错,是按照李维的例子试的
tresa 2003-11-12
  • 打赏
  • 举报
回复
多人接受答案了,现在给分!
猛禽 2003-11-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虽然可以执行,但要考虑到以后可能出现的的并发访问,那时它可能就会有问题了。
Miracle 2003-11-04
  • 打赏
  • 举报
回复
访问http://localhost/corbawebservice/PCorbaWebservice.dll/soap/IIChenjieYJ出错?你一定是直接在浏览器中输入这个地址了。soap项不是这么用的,还是好好看看书吧。
猛禽 2003-11-04
  • 打赏
  • 举报
回复
CB应该也是不行滴

因为IMPL的实例是每次调用请求时重新创建的,而WEBMODULE的实例则是根据应用的不同而不同,二者不能直接互访。

SOAPDATAMODULE不是一般的DATAMODULE,而是一个特殊的接口实现,它也和IMPL实例一样是在每次客户端调用请求时创建。

我刚看了你发来的程序,
YJSignal:CJSignalCorba;
SampleSignal,FeatureSignal:DoubleArray;
samplepoint,frequence:integer;
这三个作为全局变量也是有问题滴,IMPL的实例是多线程的,可能造成访问冲突。
tresa 2003-11-04
  • 打赏
  • 举报
回复
但是好象C++Builder可以这样处理的。这是什么原因呢?
而且改用SOAPDataModule的话,这模块里面又应该加些什么控件,具体又应该怎么实现呢?难道它就可以这么互相引用吗?
猛禽 2003-10-31
  • 打赏
  • 举报
回复
>3、在Impl文件里定义接口函数,此文件里包含WebModule文件,应该没有问题。

正是这里出问题了,因为DELPHI的WEBSERVICE的实现机制决定了,INTFIMPL和WEBMODULE是完全隔离的(具体实现我还没搞清楚),即不能在IMPL中引用任何WEBMODULE的部分,反之亦然。

我想你是想做一个有状态的东东,在WEBMOD中创建一些东东供INTFIMPL使用,但很不幸,DELPHI的WEBSERVICE不支持这样做,首先因为SOAP协议本身是一个轻量的协议,是一个完全的Request/Response实现(跟HTTP一样,所以才能方便地用HTTP实现--即WEBSERVICE),它不要求某次SOAP调用依赖于上次的调用。

解决这个问题有一个办法:改用SOAPDataModule。它提供了一个有状态的解决方案,当然也比标准WEBSERVICE笨重许多。
tresa 2003-10-31
  • 打赏
  • 举报
回复
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文件,应该没有问题。
请大虾们帮忙看看我的代码到底是哪里有问题咯,多谢先!
猛禽 2003-10-20
  • 打赏
  • 举报
回复
1、只要能生成WSDL一般没有问题,你只要用WSDLImport导入接口即可访问,如出现你说的错误,应该是URL不正确
2、只有DEBUG才能知道了
猛禽 2003-10-18
  • 打赏
  • 举报
回复
可以,新建一个WAD应用,把WAD里的PAGE(不是FORM,别搞错了)删除,然后把ISAPI里的所有PAGE加进来即可。
tresa 2003-10-17
  • 打赏
  • 举报
回复
这种ISAPI的程序能直接转化为WAD的吗?Raptor兄
猛禽 2003-10-17
  • 打赏
  • 举报
回复
应该是你用到CORBA的地方有问题,先用WAD方式调试一下看看
ntfs2 2003-10-17
  • 打赏
  • 举报
回复
你先测试一下你在dll的模式下数据库的连接有无问题,我也不知道在soap中和iis有无冲突!,你可以用apache的服务器试试!

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧