我有以下情况:
这是正确的行为,还是应该在服务器上出现异常?
我在JBOSS上使用JAX-WS。
谢谢!
答案 0 :(得分:2)
理论上这是正确的行为。 HTTP通常使用tcp / ip连接,TCP允许客户端关闭连接但仍等待传入数据。 RFC 793 3.5
因此,从底层传输层的角度来看,服务器无法知道客户端是否仍然可以处理该进程。
HTTP RFC 2616规定,如果客户端或服务器希望超时,则应该合理地关闭底层tcp连接,并且两者都应该仔细监视底层连接。当客户端希望关闭tcp连接时,它没有准确指定服务器应该执行的操作。只是处理它"适当"。
当客户端或服务器希望超时时,应该发出优雅的内容 关闭运输连接。客户端和服务器应该都是 不断地关注运输的另一边,并且 在适当的时候回应它。如果客户端或服务器未检测到 另一方及时关闭会导致不必要的资源 流失在网络上。 From Section 8.1.4 of RFC 2616
如果客户端死亡,则可能意味着1)TCP连接上的非正常超时或2)客户端正常关闭。 (可能取决于客户是偶然死亡还是顺利被杀)
如果您的服务器可以检测到1)它应该停止并记录错误。如果它无法检测到它,继续处理并尝试响应是适当的行为。
如果您的服务器检测到2)(它应该是什么)并且已经发送(例如发送标头),它应该继续这样做,因为这是TCP连接的预期行为,HTTP让您可以选择。如果您的服务器仍在处理请求并且没有开始发送任何内容,则应停止处理并记录错误。
流行的NGINX使用http 499客户端关闭请求错误代码。见NGINX error 499