发送长度大于 1448 字节的 Soap XML 内容时文件过早结束异常

Premature end of file exception when sending Soap XML content with a length greater than 1448 bytes

我正在使用 Savon gem 当 post 将数据从 Rails 上的 Ruby 上托管在 Amazon EC2 服务器上的应用程序也发送到基于 ColdFusion 的 Soap 网络服务时托管在不同的 Amazon EC2 服务器上。我可以成功地 post 到许多网络服务,但是当我尝试发送 Content-Length 大于 1448 字节 的请求时,它失败并出现以下错误:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <soapenv:Fault>
      <faultcode>soapenv:Server.userException</faultcode>
      <faultstring>org.xml.sax.SAXParseException: Premature end of file.</faultstring>
      <detail>
        <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">ip-xx-xx-xx-xx</ns1:hostname>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>

奇怪的是,我可以成功地 post 来自本地开发机器的相同请求,甚至来自我尝试测试的其他 Heroku 服务器之一。

我研究了我发送的数据,确定这绝对是一个整体内容长度问题,与 XML 中的特定元素无关。我知道 XML 的格式正确,因为我可以从我的其他服务器 post。它仅在从我的生产 EC2 服务器发送时导致错误。

EC2 上是否有某些设置可能会导致内容长度超过 1448 字节时出现问题?

问题出在发送 Amazon EC2 服务器上的 MTU 设置上。它被设置为 9001,我认为接收服务器正在截断更大的数据包,我相信它被设置为 1500。

将发送服务器上的设置更改为 1500 后,问题就解决了。

这是我阅读的有助于提供答案的页面: http://docs.aws.amazon.com/redshift/latest/mgmt/connecting-drop-issues.html

此页面包含我用来更改发送服务器上的 MTU 设置的实际命令: http://docs.aws.amazon.com/redshift/latest/mgmt/connecting-drop-issues.html#set-mtu

在 Linux 操作系统上设置 MTU

如果您的客户端 运行 在 Linux 操作系统中,您可以使用 ip 命令查看和设置 MTU 值。

运行以下命令判断当前MTU值:

$ ip link show eth0

查看输出中 mtu 后面的值。

如果值不是1500,运行下面的命令来设置它:

$ sudo ip link set dev eth0 mtu 1500

知道问题发生在大于 1448 的内容长度上对于找到问题至关重要!