繁体   English   中英

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

[英]Keep-Alive appears in HTTP header on Debian/Mono - not on Windows

我的任务是在Debian 7上设置一个基于ServiceStack的C#应用​​程序。

该应用程序使用.NET 4.5.2编译,我在Debian上安装了mono 4.4.2 (使用mono的Debian存储库)。

应用程序启动正常(在它自己的用户下)。 当我启动与该服务通信的客户端时(使用POST,在此问题的最后更多内容),客户端在尝试传输它的第二个POST(也是第二个总消息到服务器)时崩溃。

如果我在发送第二条消息之前等待~15秒,它确实有效。 使用Wireshark查看此内容时,显而易见的是:

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

  • Keep-Alive出现在HTTP标头中( Keep-Alive: timeout=15,max=100
  • 指定的HTTPAPI不同( Mono-HTTPAPI/1.0

我不认为HTTPAPI是一个问题,因为我可以传输数据,如果我在两个POST之间等待15秒。 由于15秒的事情,我倾向于认为Keep-Alive是罪魁祸首。

如果我在Windows / .NET 4.5.2计算机同一客户端之间传输数据,则HTTP标头中没有Keep-Alive标志 ,HTTPAPI读取Microsoft-HTTPAPI/2.0 当然,我也可以发送多个POST而不会发生异常,也不会丢失连接。

我不知道Debian / mono机器在哪里拉动Keep-Alive的东西或如何改变它。 在大多数SO问题上,人们要么被要求更改他们的IIS设置(这是自托管的,在Linux上因此这不起作用,呃)或者在HttpWebRequest上设置它(我无法访问/ isn'那里。)

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

啊,差点忘了:

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

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

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

要解决此问题,您可以按照推荐的方式使用Nginx + HyperFastCGI在Linux上安装ServiceStack。 该文档可在这里它的Ubuntu Linux编写的,但不应该是为Debian太多不同。

另一种选择:您可以简单地安装nginx并将其用作WebServiceHost的反向代理 在这种情况下,您可以在服务器端使用保持活动设置。

  • 您可以使用keepalive_disable指令为您的客户端代理禁用keep-alive(请参阅nginx文档

  • 使用keepalive-timeout指令限制保持活动超时(请参阅nginx文档

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

另外,为了确定问题的原因,如果您提供可重复的小样本,这将显示它并告诉您的客户端运行的操作系统,这将是很好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM