当前位置: 代码迷 >> PB >> pb9生成webservice对象怎么改服务地址
  详细解决方案

pb9生成webservice对象怎么改服务地址

热度:65   发布时间:2016-04-29 07:12:14.0
pb9生成webservice对象如何改服务地址
开发时webservice对象建立后deploy后调用
但开发时的webservice服务地址与实际应用地址并不一致,移植也同样存在上述问题

有没有办法直接修改web服务地址,或者把服务地址做成参数调用

现在用的是pb9,据说pb11的createinstance函数具有地址参数

------解决方案--------------------
pb12 里面可以通过 SetProxyServer() 指定服务器地址和端口;通过 SetOption() 指定超时等待时间。
------解决方案--------------------
conn.CreateInstance (ref powerobject proxy_obj, string proxy_name, {string portname}) throws SoapException

Argument Description
conn The name of the SoapConnection object that establishes the connection 
proxy_obj The referenced name of your proxy object
proxy_name The name of the proxy, based on the port name from a URL in the WSDL file stored in the proxy
portname  (Optional) The port name from a URL not stored in the proxy


第三个参数portname就是你实际使用的服务器的asmx的url,指定这个地址就可以了
------解决方案--------------------
如果你还没有实际做的话,建议到网上搜索一下相关的实例资料,有很多,基本上大同小异,我就是直接抄过来用的,没什么大问题。当然,我指的是 pb11 以上的资料。

通常并没有必要在 CreateInstance() 中指定服务器地址,因为通过 wsdl 生成的代理对象中已经描述了这些信息;但如果应用服务器的地址改变,而你又不想重新产生 wsdl 来更新代理对象的话,则需要在 CreateInstance() 中指定地址。

如果 ws 不可以匿名访问的话,通过代理访问应用服务器则会产生 401 权限不足的问题,因为 pb 必须通过生成代理对象来调用 ws,所以只好通过 SetProxyServer() 再指定一次应用服务器的地址。

超时的体现就是:如果 ws 的服务器是关着的,而你设置了 timeout=1,你的程序就不会因为等待服务器的响应而“假死”。
------解决方案--------------------
不好意思,我的说法有误!超时设置只有在服务器能够 ping 通的情况下才有效,比如说服务没有启动。对于你的问题,我想有两个解决方案:
一是不使用 ip 地址,改用 ws 主机的域名,这样的话即使 ws 服务器不存在,DNS 的响应时间通常也不会超过 3 秒(当然前提是域名服务器能够正常工作)。

二是在执行 ws 函数前先 ping 一下服务器,在 pb 中调用 api 来模拟 ping 命令比较麻烦,你可以参考一下国外高手 Roland Smith 的代码(适合 pb unicode):


结构体定义:
type icmp_echo_reply from structure
unsignedlong address
unsignedlong status
unsignedlong roundtriptime
unsignedlong datasize
unsignedlong reserved[3]
character data[]
end type


API 声明:
Function ulong FormatMessage( &
ulong dwFlags, &
ulong lpSource, &
ulong dwMessageId, &
ulong dwLanguageId, &
Ref string lpBuffer, &
ulong nSize, &
ulong Arguments &
) Library "kernel32.dll" Alias For "FormatMessageW"
Function ulong GetLastError() Library "kernel32.dll"
Function ulong inet_addr(string cp) Library "ws2_32.dll" Alias for "inet_addr;Ansi"
Function ulong IcmpCreateFile() Library "icmp.dll"
Function long IcmpSendEcho ( &
ulong IcmpHandle, &
ulong DestinationAddress, &
string RequestData, &
long RequestSize, &
long RequestOptions, &
Ref icmp_echo_reply ReplyBuffer, &
long ReplySize, &
long Timeout &
) Library "icmp.dll" Alias for "IcmpSendEcho"
Function long IcmpCloseHandle(ulong IcmpHandle) Library "icmp.dll"
  相关解决方案