PB11.5调用Webservice报错Server eroor!请教原因

nocry115 2016-09-09 02:30:48
对方WSDL创建的Webservice Proxy无需.NET引擎(选上反而无法识别),deploy后的几个对象也很正常
pbsoapclient115.pbd也在库列表中

调用这个WSDL的方法时(作用是向对方输出数据),前面的步骤都没问题,语法如下:
//
string ls_msg, ls_ret
soapconnection lsc_conn //获取soap类
n_jhdhttp_port lws_obj //调用wsdl
rfc__zssd_jhdgb lsrt_data //对方方法的结构类参数

string ls_shws_id, ls_shws_pw
ls_shws_id = '账号'
ls_shws_pw = '口令'
lsc_conn =create soapconnection
lsc_conn.setbasicauthentication('',ls_shws_id, ls_shws_pw) //
int li_r
li_r = lsc_conn.createinstance(lws_obj,"n_jhdhttp_port")
if li_r <> 0 then
ls_ret = '创建WebService实例失败'
as_msg = '错误代码:' + string(li_r)
return ls_ret
end if

//对参数lsrt_data赋值
//...
//END赋值

ls_ret = lws_obj.SI_03AA6_SNZYXT2ERP_JHDGB(ls_msg, lsrt_data)
return ls_ret

//..程序编译没有问题,但运行就报错:server error

//
调试过程中发现,就是执行到这一句出的问题:
ls_ret = lws_obj.SI_03AA6_SNZYXT2ERP_JHDGB(ls_msg, lsrt_data)
请问到底是哪里出现的问题?

但是用IE访问对方的WSDL真实地址,能看到其XML代码结构,不应该是网络问题啊;结构参数也让对方全改为string类型了

...全文
1491 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nocry115 2016-09-13
  • 打赏
  • 举报
回复
谢谢!的确是头疼……
引用 11 楼 lzp_lrp 的回复:
oleobject直接转换为结构试试
如果不行,建议你用其它语言来实现吧,比如用C写个dll,实现这些功能,然后用pb调用,或者再用java封装个中转的webservice之类的

用MSSOAP进行身份验证现在倒是可以了,语法如下:
MSSOAPLib1.mssoapinit("jhd.wsdl")
MSSOAPLib1.ConnectorProperty("AuthUser", ls_user )
MSSOAPLib1.ConnectorProperty("AuthPassword", ls_pasw)
MSSOAPLib1.ConnectorProperty("EndPointURL", ls_wsdl) //ls_wsdl为真实wsdl链接
但最后一步调用对方方法时还是出错了:
MSSOAPLib1.si_03aa6_snzyxt2erp_jhdgb( lsrt_data) //出错
MSSOAPLib1.si_03aa6_snzyxt2erp_jhdgb(ls_arg[1],ls_arg[2],...ls_arg[15]) //出错
MSSOAPLib1.si_03aa6_snzyxt2erp_jhdgb( ls_msg, lsrt_data) //出错
改成函数,参数类型ref,问题依旧……

方法名称应该没错,参数换了几种形式都不行,郁闷啊……
通过.Net Webservice Studio解析对方的wsdl也是正常的。
WorldMobile 2016-09-13
  • 打赏
  • 举报
回复
oleobject直接转换为结构试试 如果不行,建议你用其它语言来实现吧,比如用C写个dll,实现这些功能,然后用pb调用,或者再用java封装个中转的webservice之类的
nocry115 2016-09-13
  • 打赏
  • 举报
回复
首先感谢解答!
引用 8 楼 lzp_lrp 的回复:
应该是ref引起的问题,不要用实参,用形参试试
调用函数定义了2个ref参数,传进去,问题依旧……
引用 9 楼 lzp_lrp 的回复:
另外,如果你建立webservice代理时的Url和你运行时一样的话,在调用CreateInstance可以不用加Url。
webservice是对方SAP的PI建立的,在远端,而且有身份验证;所以加了lsc_conn.setbasicauthentication(),而且对方WSDL只能用pbsoapclient115.pbd,用pbwsclient115.pbd验证时会报错。 另,问过对方的WSDL,webservice函数名的确是SI_03AA6_SNZYXT2ERP_JHDGB,但输入参数只有1个结构类型rfc__zssd_jhdgb,返回另1个结构参数(成员为2个string,1个结构rfc__zssd_jhdgb);用PB解析后的webservice Proxy,函数定义形式走样了,不知道是不是PB11.5的问题,换了PB12.6.1编译这个wsdl后函数形式还是如此…… 不知如何解决?昨天找了台32位的电脑,装了microsoft soap toolkit sdk3.0,学习你们共享的文章,用OLE方式调用Webservice: MSSOAPLib1.ConnectToNewObject("MSSOAP.SoapClient30") MSSOAPLib1.mssoapinit(ls_wsdl) 其后调用自己用PB11.5开发的wsdl方法是成功的(不过ws函数返回是结构类型,这里返回的是OLEobject,不知如何解析); 但用MS SOAP调用对方WSDL,可能因为有身份验证,到 MSSOAPLib1.mssoapinit(ls_wsdl)这步就出问题了,加了语法也不行: MSSOAPLib1.ConnectorProperty("AuthUser", ls_user ) MSSOAPLib1.ConnectorProperty("AuthPassword", ls_pasw) …… 茫然中,请不吝指点!
WorldMobile 2016-09-12
  • 打赏
  • 举报
回复
另外,如果你建立webservice代理时的Url和你运行时一样的话,在调用CreateInstance可以不用加Url。
WorldMobile 2016-09-12
  • 打赏
  • 举报
回复
引用 4 楼 nocry115 的回复:
[quote=引用 3 楼 sbks 的回复:]
这句:
li_r = lsc_conn.createinstance(lws_obj,"n_jhdhttp_port")
createinstance时,要带上对方webservice的地址参数
--------------
//初始化soap连接与代理
string ls_urldw
long rn

ls_urldw = "http://192.168.1.1/bdlws/n_service.asmx?WSDL"
rn = soapcon.CreateInstance(gp_dw, "n_dwsoap",ls_urldw)


感谢!加上地址后,又出现了405 method not allowed错误

[/quote]

应该是ref引起的问题,不要用实参,用形参试试
nocry115 2016-09-10
  • 打赏
  • 举报
回复
引用 5 楼 sbks 的回复:
看样子webservice的调用已经通讯正常,这是认证方面有什么差错了
认证方面:请问应从对方服务器找原因,还是从我们这边的调用找原因呢?
sbks 2016-09-10
  • 打赏
  • 举报
回复
看样子webservice的调用已经通讯正常,这是认证方面有什么差错了
nocry115 2016-09-10
  • 打赏
  • 举报
回复
引用 3 楼 sbks 的回复:
这句:
li_r = lsc_conn.createinstance(lws_obj,"n_jhdhttp_port")
createinstance时,要带上对方webservice的地址参数
--------------
//初始化soap连接与代理
string ls_urldw
long rn

ls_urldw = "http://192.168.1.1/bdlws/n_service.asmx?WSDL"
rn = soapcon.CreateInstance(gp_dw, "n_dwsoap",ls_urldw)


感谢!加上地址后,又出现了405 method not allowed错误

sbks 2016-09-10
  • 打赏
  • 举报
回复
这句: li_r = lsc_conn.createinstance(lws_obj,"n_jhdhttp_port") createinstance时,要带上对方webservice的地址参数 -------------- //初始化soap连接与代理 string ls_urldw long rn ls_urldw = "http://192.168.1.1/bdlws/n_service.asmx?WSDL" rn = soapcon.CreateInstance(gp_dw, "n_dwsoap",ls_urldw)
nocry115 2016-09-10
  • 打赏
  • 举报
回复
引用 1 楼 pcwe2002 的回复:
只能换个调用方式试试,像这种是pb库不支持的问题。
求教可以用哪些调用方式呢?PB能衔接吗?
sbks 2016-09-10
  • 打赏
  • 举报
回复
引用 6 楼 nocry115 的回复:
[quote=引用 5 楼 sbks 的回复:] 看样子webservice的调用已经通讯正常,这是认证方面有什么差错了
认证方面:请问应从对方服务器找原因,还是从我们这边的调用找原因呢?[/quote] 好象也不一定是认证方面的事,这个ws的参数是ref的,也许是参数的类型或者格式不符合对方的规范 因为服务器给了回复,只能说明跟服务器的交互是通畅的, 一般服务器会有日志的,或者跟服务器端的代码开发者协同联合调试,看看到底是什么原因导致 这些我也没太多经验了,很期待你的解决方案
pcwe2002 2016-09-09
  • 打赏
  • 举报
回复
只能换个调用方式试试,像这种是pb库不支持的问题。

662

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder Web 应用
社区管理员
  • Web 应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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