我正在尝试从Silverlight应用程序建立一个HTTP持久连接到由Apache服务器托管的PHP页面(即在每个HTTP请求中不创建新的TCP连接)。
为此,我需要Web服务器使用“Connection”标头设置为“Keep-Alive”发送其HTTP响应。在客户端方面,似乎没有任何问题,因为Silverlight提供的网络API基本上是浏览器网络功能的包装器,根据我所读到的:如果浏览器默认支持HTTP 1.1和Connection:Keep-Alive进行请求,则很好。Content-Length也定义良好,因此服务器知道何时发送响应。然而,对PHP请求的服务器响应系统地将“Connection:”设置为“close”,从而结束了连接并防止持久连接。
我已经尝试了一些解决此问题的方法:使用不同的方法(GET和POST),在我的脚本开头使用以下PHP代码明确地给出“Connection:keep-alive”的响应:
为此,我需要Web服务器使用“Connection”标头设置为“Keep-Alive”发送其HTTP响应。在客户端方面,似乎没有任何问题,因为Silverlight提供的网络API基本上是浏览器网络功能的包装器,根据我所读到的:如果浏览器默认支持HTTP 1.1和Connection:Keep-Alive进行请求,则很好。Content-Length也定义良好,因此服务器知道何时发送响应。然而,对PHP请求的服务器响应系统地将“Connection:”设置为“close”,从而结束了连接并防止持久连接。
我已经尝试了一些解决此问题的方法:使用不同的方法(GET和POST),在我的脚本开头使用以下PHP代码明确地给出“Connection:keep-alive”的响应:
header("Connection: Keep-alive");
后者会向响应添加期望的标题,这很好,但是在响应标头中仍然附加了一个额外的“Connection: close”。这是 PHP 或 Apache 的特性吗?它强制执行“close”(出于某种安全或性能目的,我猜测),还是我漏掉了什么?提前感谢您的回答。顺便说一句,通过嗅探数据包,我注意到很少有网站使用“Keep-alive”,而TCP连接得到重新建立。在 HTTP 1.1 下,不是 Keepalive 是默认和首选行为吗?