考虑以下场景,servlet是用Java编写的,一旦连接到servlet,它就会开始向OutputStream写入,比如说1000万字节,一次1个字节。
您有一个客户端程序,它读取servlet的响应流并读取例如100个字节,然后调用close。现在,如果您的客户端程序是Java,流会立即关闭,服务器会停止发送内容,但如果客户端程序是C#,关闭调用需要很长时间才能完成,因为它显然要等待服务器完成所有1000万字节的写入。
因此,我有两个问题,
- 为什么C#的行为不同
- 我该怎么做才能确保C#流上的Close调用立即关闭流,并且不允许服务器继续发送数据
任何指针都将不胜感激:-)
我假设这里有某种类型的套接字。我怀疑Java实现只是关闭了客户端套接字,可能会在服务器上导致错误,而C#版本对服务器稍微友好一些,并等待它确认关闭请求。由于服务器正忙于发送数据,所以在完成发送之前,它不会收到——或者至少不会处理——关闭请求。
这样想吧:有人在你的前门试图卖给你一些东西,但不会被打断。你可以当着他们的面把门关上,让他们立刻闭嘴,也可以等到他们说完后再让他们离开。
为了解决这个问题,也许您可以创建一个工作线程来打开流,等待100个字节,然后关闭。与此同时,当线程最终关闭时,程序可以做它需要做的任何事情。
所以,我终于在几周前发现了这一点,并与微软进行了验证。C#和Java之间的区别在于,在Java中,关闭调用也会关闭请求/连接,而在C#中,除非您随后调用xxxRequest.Artrt(),否则不会发生这种情况。希望这也能帮助其他人。