【问题标题】:Force Http 1.0 idHttpServer and TIME_WAIT强制 Http 1.0 idHttpServer 和 TIME_WAIT
【发布时间】:2011-02-22 18:55:04
【问题描述】:

Delphi 2010,来自 Svn 的 Last Indy 源代码。

有谁知道如何强制 TIDHttpServer 发送 http 1.0 响应,而不是发送 http 1.1? 我想摆脱持久连接(保持活动状态),并且我希望客户端与我的服务器断开连接,而不是我的服务器与客户端断开连接(以避免在我的服务器中出现 TIME_WAIT)。

一些数据:

客户端(在本例中为 Internet Explorer)发出的请求:

GET / HTTP/1.0
接受:/
接受语言:pt-BR
用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;WOW64;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0 ; InfoPath.3; .NET4.0C; .NET4.0E)
主机:本地主机:114
连接:保持活动状态

来自我的 Indy 服务器的响应:

HTTP/1.1 200 正常
连接:关闭
内容类型:文本/html;字符集=ISO-8859-1
内容长度:2717

如您所见,客户端明确告诉服务器使用 http 1.0,但 indy 服务器响应是 http 1.1。

编辑:

我发现最好的解决方案是在 OnCommandGet 事件中设置:

AResponseInfo.CloseConnection := False;
AResponseInfo.Connection := '关闭';

AResponseInfo.CloseConnection := False 使服务器不与客户端断开连接,而 Connection := 'close' 使客户端与服务器断开连接,避免服务器 TIME_WAIT。

【问题讨论】:

    标签: delphi sockets winsock indy


    【解决方案1】:

    在 IdCustomHTTPServer.pas 中

    版本字符串“HTTP/1.1”在TIdHTTPResponseInfo.WriteHeader 方法中硬编码。

    此类没有可以覆盖的工厂,因此您可以使用后代版本更改其行为。它是在TIdCustomHTTPServer.DoExecute 中明确创建的

    但是,由于您确实拥有源代码,因此您可以将硬编码字符串更改为“HTTP/1.0”,或者根据属性设置更改其响应行为。

    同时设置IdHttpServer.KeepLive := False; 会停止持久会话,但它确实会导致服务器在请求结束时断开客户端的连接。

    【讨论】:

    • 当然,仅仅改变字符串是不够的。您还必须确保类行为符合 HTTP 1.0 服务器应有的方式。
    • OK .. 我发现最好的解决方案是设置: AResponseInfo.CloseConnection := False; AResponseInfo.Connection := '关闭'; CloseConnection 使服务器不与客户端断开连接,而 Connection := 'close' 使客户端与服务器断开连接。但我会接受你的回答,因为那是我问的。谢谢。
    猜你喜欢
    • 2020-03-10
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2010-09-19
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多