我遇到连接断开的问题,我认为这是由于http keepalive的行为不正确,但我无法理解'culpit'是在客户端还是在服务器端 .

我正在处理客户端发送和HTTP 1.1请求的场景:

Connection: close

并且服务器不会使用Connection标头进行回复 . 行为如下:

  • 客户端发送请求

  • 服务器发送响应

  • 服务器不会关闭连接

  • 客户端不关闭连接(.1)

  • 客户端使用相同的连接发送另一个请求

  • 服务器不执行任何操作,并在30“关闭连接后

组件如下:

  • 客户端:Java HttpConnection(在Dell Boomi iPaaS中)

  • 服务器:SAP ERP OData Webservice

根据这篇文章:“Should a server adhere to the HTTP Connection: close header sent from a client?”问题似乎在客户端 . 但是,Java HttpURLCoonnection实现应该非常强大(在Linux v 1.7.0_55-b13上测试x64服务器VM,在Windows 7 v 1.7.0_75-b13上测试x64服务器) .

以下是来自客户的第一个请求的完整标头集:

GET /sap/opu/odata/SAP/ZZSALESORDER_SRV/$metadata HTTP/1.1
User-Agent: Boomi Http Transport
Authorization: Basic YmPRIVATESECRETPLEASExNg==
X-CSRF-Token: Fetch
Connection: close
Cache-Control: no-cache
Pragma: no-cache
Host: some.server.behind.firewall.local:8000
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Cookie: sap-usercontext=sap-client=100; SAP_SESSIONID_DEV_100=Cm7LsDSECRETSECRETSECTERFaIMak%3d

这些是来自服务器响应的:

HTTP/1.1 200 OK
content-type: application/xml
content-length: 79750
x-csrf-token: oolTHISAGAINISASECRET3PA==
last-modified: Fri, 25 Mar 2016 17:55:35 GMT
dataserviceversion: 2.0

服务器回复后,客户端使用相同的连接发送第二个请求:

PUT /sap/opu/odata/SAP/ZZSALESORDER_SRV/SalesOrderItems(NumDocSap='1200001534',PosId='000020') HTTP/1.1
User-Agent: Boomi Http Transport
Content-Type: application/atom+xml
X-CSRF-Token: oolZMYSECRETPA==
Connection: close
Authorization: Basic YmPRIVATESECRETPLEASExNg==
Cache-Control: no-cache
Pragma: no-cache
Host: some.server.behind.firewall.local:8000
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Length: 406
Cookie: sap-usercontext=sap-client=100; SAP_SESSIONID_DEV_100=Cm7PRETTYPRIVATESECRETak%3d

并且服务器在30“之后没有回复并突然关闭连接 .

设置JVM标志可以完全解决问题

http.keepAlive=false

在Java客户端(Boomi),但这似乎更多的解决方法,然后解决方案 .

有人可以解释一下:

  • 客户端或服务器端是否存在HTTP协议违规?

  • 可以通过发送不同的 Headers 来修复吗?