发送长度大于 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 的内容长度上对于找到问题至关重要!
我正在使用 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 的内容长度上对于找到问题至关重要!