我在尝试发送web服务调用时遇到905(11773)错误。我认为这与web服务花费太长时间有关,并且某种内部进度超时被击中(我没有设置任何超时)。我这么想是因为我可以向同一个web服务发送小请求,它运行良好,但大请求返回时会出现上述错误。有什么想法吗?有这样的休息时间吗?
Error receiving Web Service Response: (11773)
An error ocurred in the process of receiving a SOAP response message.
The error details are appended.
但没有附加任何细节。。。
编辑:在有人问我之前,我没有使用wait-for
和所有摆在桌面上的东西。
进度版本:11.3
这是一个非常简单的连接和呼叫。只需连接到服务器,连接到端口,然后拨打电话。没有任何特殊代码。我已经把它划掉进行测试了。所以我认为这不是一个编码问题,我认为这是一个进度配置问题。
不确定它会有什么帮助,但以下是我为stackoverflow编辑的代码(注意,这是在尝试异步东西之前,因为它有相同的结果):
define variable hWebService as handle no-undo. /* Handle to Web Service */
define variable hPricePort as handle no-undo. /* Handle to Web Service Price Port */
define variable cConnection as character no-undo. /* Web Service host / connection string */
define variable lcPrices as longchar no-undo.
define variable lcOutput as longchar no-undo.
create server hWebService.
hWebService:connect(cConnection) no-error.
if error-status:error or not hWebService:connected() then do:
delete object hWebService.
message errMsg("Error WebService:connect(" + cConnection + ")").
return.
end.
run PriceWebServiceSoap set hPricePort on hWebService no-error.
if error-status:error then do:
delete object hWebService.
message errMsg("Error setting adding pricing port: ").
return
end. /* if error-status:error */
run createPricesXml(input-output lcPrices).
run ImportRetailPrices in hPricePort (input lcPrices, output lcOutput) no-error.
if error-status:error then
message errMsg("Error making price call:"). /* FROM THIS CHECK I'M GETTING: Unexpected response status code: 905 (11773) */
if valid-handle(hPricePort) then
delete procedure hPricePort no-error.
/* Close "connection" to the Web Service */
if valid-handle(hWebService) then do:
if hWebService:connected() then
hWebService:disconnect() no-error.
delete object hWebService no-error.
end.
如果它确实是一个超时,那么处理它的一个好方法就是使用异步连接。这样你就很容易改变你等待回复的时间。
我在运行OpenEdge的Web服务方面有着丰富的经验,我想我从来没有(或者至少很少)看到过超时。不过,这可能与您所调用的Web服务的稳定性有关。如果它确实是一个超时,那么它总是在完全相同的时间之后发生。我不知道这段时间有多长。在线帮助(11.6中指出,对于纯套接字,超时不存在,会话将永远等待)。
异步请求对于外部服务来说总是一个好主意,因为您可以更好地处理奇怪的行为。
下面您将看到一个关于如何运行async的简单示例。省略了连接、断开和清理。
DEFINE VARIABLE phPort AS HANDLE NO-UNDO.
DEFINE VARIABLE hHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE glcRequest AS LONGCHAR NO-UNDO.
DEFINE VARIABLE glcResponse AS LONGCHAR NO-UNDO.
DEFINE VARIABLE glReply AS LOGICAL NO-UNDO.
DEFINE VARIABLE iTimeOut AS INTEGER NO-UNDO INITIAL 60.
/* This procedure will run when a response is recieved */
PROCEDURE WebServiceReply:
DEFINE INPUT PARAMETER pcRequest AS LONGCHAR NO-UNDO.
DEFINE OUTPUT PARAMETER pcResponse AS LONGCHAR NO-UNDO.
glReply = TRUE.
/* This is where the response should be handled */
END.
/*
Connect left out
*/
RUN WebService IN phPort ASYNCHRONOUS SET hHandle
EVENT-PROCEDURE "WebServiceReply"
( INPUT glcRequest
, OUTPUT glcResponse ) .
WAIT-FOR PROCEDURE-COMPLETE OF hHandle PAUSE iTimeOut.
IF glReply = FALSE THEN DO:
MESSAGE "No response recieved" VIEW-AS ALERT-BOX ERROR.
hHandle:SERVER:CANCEL-REQUESTS().
PROCESS EVENTS.
END.
Web服务的一般故障排除
当遇到Web服务调用问题时,我发现使用一个记录所有请求和响应的代理很容易。有几个可用的,但为什么不试试Progress旗下的一个呢:Telerik Fiddler。
您需要先下载并安装Telerik。
在您的Progress启动中,您添加了两个参数:
-proxyhost localhost -proxyport 8888
8888是Telerik默认的代理端口。如果你愿意,可以更改它,但也可以在Fiddler中更改。在您的本地机器上运行代理-这将是最简单的。
现在,如果你再次启动Progress会话,所有的网络服务都将通过代理调用,Fiddler将记录所有进出的数据。也许你能发现一些奇怪的东西?
如果其他所有操作都失败
如果您使用的是活动许可证,您可以随时使用Progress记录请求案例。