Keep-Alive出现在Debian/Mono的HTTP头中-而不是在Windows上

本文关键字:Windows 头中 Debian Keep-Alive Mono HTTP | 更新日期: 2023-09-27 18:05:16

我的任务是在Debian 7上建立一个基于ServiceStack的c#应用程序。

使用编译应用程序。. NET 4.5.2和我已经在Debian上安装了mono 4.4.2 (使用mono的Debian库)。

应用程序启动正常(在它自己的用户下)。当我启动一个与该服务通信的客户端(使用POST,更多关于这个问题的末尾),客户端在试图传输它的第二个POST(也是第2个总消息到服务器)时崩溃。

如果我在发送第二条消息之前等待~15秒,它确实工作。当使用Wireshark查看这个时,发生的事情变得很明显:

Debian/Mono上,在客户端确认最后一个HTTP消息(TCP 'ACK')后约15秒发送TCP 'FIN/ACK'信号。当查看正在传输的HTTP包时,我能够看到两件事:

  • Keep-Alive出现在HTTP报头(Keep-Alive: timeout=15,max=100)
  • 指定的 httpi 不一致(Mono-HTTPAPI/1.0)

我不认为httpi的东西是一个问题,因为我可以传输数据只是很好,如果我等待15秒之间的两个帖子。由于15秒的事情,我倾向于相信Keep-Alive是罪魁祸首。

如果我在一个Windows/。. NET 4.5.2机器相同的客户端没有Keep-Alive标志在HTTP头和httpi读取Microsoft-HTTPAPI/2.0。当然,我也可以发送多个post而不会出现异常,也不会导致连接中断。

我不知道Debian/mono机器从哪里拉出Keep-Alive的东西,也不知道如何改变它。在大多数SO问题上,人们要么被要求改变他们的IIS设置(这是自托管的,在Linux上因此这不起作用,duh),要么在HttpWebRequest(我没有访问权限/不存在)上设置它。

所以,我的问题是:我如何删除超时?

啊,差点忘了:

客户端站点 XmlServiceClient.Post(SomeObjectOfClass); 用于发送消息。在15秒内执行两次,导致出现一个ObjectDisposedException,由一个不存在/已处置的Socket触发。

服务器站点 WebServiceHost.Init().Start("http://*:1234/"); 用于启动服务。一个包含一堆Any方法的类似乎可以处理创建响应。

Keep-Alive出现在Debian/Mono的HTTP头中-而不是在Windows上

看起来服务器在发送响应后关闭连接(忽略keep-alive头),而客户端仍然认为连接是打开的,并试图向关闭的套接字发送消息。

要解决这个问题,你可以按照推荐的方法在linux上使用Nginx+HyperFastCGI安装ServiceStack。它是为Ubuntu linux编写的,但是对于Debian来说应该不会有太大的不同。

另一个选择:你可以简单地安装nginx并使用它作为WebServiceHost的反向代理。在这种情况下,您可以在服务器端使用keep-alive设置。

  • 你可以使用keepalive_disable指令来禁用你的客户端代理的keep-alive(参见nginx文档)

  • 使用keepalive-timeout指令限制keep-alive超时(参见nginx文档)

  • 使用proxy_set_header Connection "";指令发送WebServiceHost时清除Connection头(参见nginx文档)

为了确定问题的原因,如果您提供一个小的可重复的示例,它将显示它并告诉您的客户端运行在哪个操作系统上,那将是非常好的。