【发布时间】:2020-08-07 09:24:03
【问题描述】:
我有一个向我们的客户端服务器发出 SOAP 请求的 Web 服务(我无权访问该服务器,也不知道 Web 服务方法是如何实现的)。
我们的代码最近没有更改并且之前运行正常(并且在大多数情况下仍然可以运行),但客户一直报告说我们的许多请求每天都失败了至少一个月,原因是“重复的 XML 声明”记录在 Data Power 中。
他们收到的 SOAP 消息被截断(大量数据丢失),并且在 XML 的末尾,最初的 SOAP 标头是重复的。看起来他们部分收到了消息,然后发生了一些错误,然后尝试重新处理它,但又失败了。基本上它看起来像这样:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendData>
<requestHeader>
//PARTIAL INFORMATION INCLUDED HERE
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendProspect xmlns="http://webservices.zurich.com/zsoa/fig/policyacquisition/prospectquote-v1_0">
<requestHeader>
什么可能导致 SOAP 消息被截断?我正在考虑客户端和服务器之间的某种通信错误,或者 Web 服务器可能发生变化,但我想知道其他人是否遇到过这个问题并可以提供一些建议。
编辑:添加从客户端收到的 HTTP 标头:
POST <webservice> HTTP/1.1
http_racfid: <info>
SOAPAction: ""
MULE_ENCODING: UTF-8
Host: <hostInfo>
Connection: keep-alive
Accept: */*
Content-Type: text/xml
Content-Length: 41341
【问题讨论】:
-
有两种 HTTP 模式(也是 HTTP/2,我们将不讨论) 1) 1.0 :流模式,数据在一个流中接收 2) 1.1 :块模式,数据以块的形式接收你必须发送下一个块消息。 HTTP 标头可以强制进入 1.0 或 1.1,但通常在服务器中使用默认模式(无标头)。解决问题的最佳方法是使用像 wireshark 或 fiddler 这样的嗅探器并捕获请求和响应,并将第一个请求中的标头与正在运行的应用程序进行比较。
-
@jdweng 我用我们的客户端发送给我们的 http 标头更新了响应,似乎他们使用的是 HTTP 模式 1.1。这可能是问题吗?这是我们需要解决的问题,还是客户需要解决的问题?我仍在学习这方面的知识,但我不确定如何解决这个问题。
-
是的。如果你没有发送 NEXT CHUNK 消息,你只会得到一个块,然后会发生超时。您可以尝试以下操作: HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL"); request.ProtocolVersion = HttpVersion.Version10;
-
@jdweng 请求是使用客户端公开的方法创建的,我们只是用一些参数调用它。我相信请求创建是在那个方法里面完成的,我不认为我可以设置 HTTP 版本。但是,如果这是问题所在,如果不发送 NEXT CHUNK 消息,那么我猜该消息只会被截断,对吧?但是由于某种原因,消息的第一部分被附加到末尾,复制了 SOAP 标头。
-
最好查看嗅探器数据。完成时响应的状态为 200 OK。 100 Continue 仅在块模式下发生。几年前,我尝试使用 WebRequest 让下一个块工作,但找不到解决方案。但我相信它是内置在一些网络库中的(不确定是哪个)。 HTTP 使用 TCP 作为传输层(最大大小约为 1500 字节)。一条 HTTP 消息由一个或多个 TCP 组成。如果没有返回 ACK,TCP 通常会重试 3 次。
标签: c# .net web-services soap ibm-datapower