早前曾经用PB12.5创建过WebService,并也用PB12.5创建了客户端,调用之,在之前的博客中也有简要要点记录:https://mp.csdn.net/mp_blog/creation/editor/51223325。由于项目需要,需要为同事做个Demo,现在捡起来,又有些陌生啦,现在把过程记录下,供自己或有元人分享。
工具PB12.5
操作系统:Win10
目录
一、创建服务端WebService及源码发布
- 创建WebService服务端。用向导即可,工作区、New、Target、.Net Web Service,一步一步即可
成品如下图所示:
- 然后就可以在对象n_webservicedemo中,增加自定义函数,发挥吧!我先弄个加法哈
这个方法就会在发布对象的Objects中列出来,把需要的勾上,发布即可
- 等等!往哪发布呢?正常应该是Deploy页签的Deploy directly to IIS,端口不 填的话,默认是80。前提是IIS服务得起来
- IIS如下,可以新建一个站点,把端口设置成其它,比如我设置为8101,以不和默认的冲突,这样的话,在PB端设置时,可以把IIS Server asddress设置为localhost:8101
这时可以尝试直接发布啦
- 验证
如果出现如下内容,说明啥,成功了呗!
- 但是,这里IIS的设置,可能出现如下错误而打不开
二、IIS错误排查
HTTP 错误 403.14 - Forbidden
HTTP 错误 404.17 - Not Found
这个就是另一个范畴的事儿啦,处理IIS吧,通常是没有安装ASP.Net,或者版本对应没有安装,将ASP.Net 4.8(我机器上是这个)安装上,重起IIS,一般这个问题就没有了,其它的话,再见再议
再重新验证一下吧
三、安装包发布WebService
1、同样需要提前在IIS上建好站点(绑定好端口8101、记住物理路径D:\SDC)
2、安装先择的目录要和选择的IIS对应端口的服务,所在的物理路径一致
3、接着按向导操作即可
四、创建客户端程序调用这个WebService
说一下重点吧
- 这种方式需要在PB和客户创建代理服务,将目标服务相关对象代理到客户商,是调用WebService的一种方式之一。其弊端是不能传Context-Type,导至如果WebService服务被发布在统一网关,而网关需要鉴权时,无法实现。如果需要解决这个问题,我是通过XMLHttp请求WebService的(准备再写一章....),各有利弊吧
- 引入相应版本的pbsoapclient125.pbd
- 先新建或个修改代理,以生成服务端的代理出来的对象
- 贴下代码
-
SoapConnection conn // Define SoapConnection
n_wbs01soap proxy_obj // Declare proxy
long rVal, lLog
int liRet
String str_endpoint,s1,s2,str_webServicename
blob lbData[]str_endpoint = sle_1.Text //"http://localhost:8100/WebService1.asmx?WSDL"
str_webServicename = sle_2.Text //n_wbs01soapconn = create SoapConnection //Instantiated connection
rVal = Conn.CreateInstance(proxy_obj,str_webServicename, str_endpoint)
IF rVal <> 0 Then
messagebox ("提示", "创建实例失败(" + mid(str_endpoint,8,6) + "),返回值:" + String(rVal) )
return
End IFString lb_result
long llResult
try
llResult = proxy_obj.of_add(1,2)
Messagebox("提示" , "proxy_obj.of_add(1,2) = " + String(llResult) )
catch (SoapException e1)
MessageBox("提示", "发生SoapException(" + mid(str_endpoint,8,6) + "),请检查组件发布是否正确!'~r~n" + e1.Text)
return
catch (PBXRuntimeError e2)
MessageBox("提示", "发生PBXRuntimeError,请检查客户端程序是否正确! ~r~n" + e2.Text)
return
catch (RuntimeError e3)
MessageBox("提示", "发生RuntimeError,请检查客户端程序是否正确~r~n" + e3.Text)
return
end try
End