【问题标题】:Reasons for SOAP message getting cutoff and header duplicated?SOAP 消息被截断和标头重复的原因?
【发布时间】: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


【解决方案1】:

duplicate XML declaration 在 DataPower 中通常发生在您的处理策略中有一个样式表操作未检测到有效 XML 并尝试“修复”它时。 这表明您没有从服务器获取完整的 XML。

为服务启用 Probe 并查看 INPUT xml。

您也可以在default 域中按照 cmets 中的建议启动数据包捕获或启动文件捕获以获取任何消息。注意!数据包捕获和文件捕获都提供了严重的性能损失,所以你不应该在大批量生产环境中这样做!

获取“真实”INPUT 的另一种侵入性较小的方法是直接在 Match 操作之后添加一个 GatewayScript 操作,该操作将 INPUT 写入您可以查看的temporary:/// 文件。这是“更安全”的,因为 temporary:/// 存储会自行清理它...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多