保持GET响应流打开
本文关键字:响应 GET 保持 | 更新日期: 2023-09-27 17:58:14
我正在执行GET请求,我不想关闭响应流。如果没有什么可读的,我想等到有了。如何在一个GET请求后保持流打开的同时保持流的持久性?
这就是我提出的要求。我目前正在使用ContinueWith读取初始响应,但两次发布之间的时间太长,流最终会关闭。
streamer = new HttpClient()
{
BaseAddress = new Uri("http://" + url + "/")
};
var get = streamer.GetStreamAsync(streamer.BaseAddress + "!" + Uri.EscapeDataString(query));
您必须定期将一些NOP数据发布到流中。在您的客户端中,您将忽略NOP,只处理返回的其他数据。
然而,我想指出的是,这是一个坏主意——这不是HTTP的用途。HTTP是围绕有响应的请求构建的,就这么简单。
如果您确实出于某种原因需要使用HTTP(例如,您的服务器在网络主机上,或者您需要使用80端口),发送一些数据或多或少是唯一的方法。您也可以指定更大的超时,但在实践中并没有太大帮助。另一种方法是在客户端进行定期轮询,但这可能更难实现——不过它确实更适合HTTP模型。一种更合理的方法可能是使用SignalR,它允许您在客户端上使用观察员自动从服务器接收数据。
最后,请注意,没有任何保证。HTTP并不是为此而设计的,而且它本身就不稳定。它旨在提供全球范围的web服务,包括代理和本地缓存等等。您必须确保缓存未被使用,并且必须准备好关闭响应,就这么简单。它可以在任何时候发生,例如应用程序池重新启动也可以。准备好优雅地处理所有这些情况。
您可以为线程创建一个新线程和一个函数,在该函数中,您可以创建一个无限while循环,最后休眠1ms。当然,它不会是无限的,因为你可以用一个变量来阻止它。因此,在这段时间内,如果流已经关闭,您可以重新请求
ThreadPool.QueueUserWorkItem(new WaitCallback(connectionPending), 1);
function void connectionPending(object threadContext)
{
while(waitForStream == true)
{
//re-request if stream is closed here
Thread.Sleep(1); //sleep for 1ms.
}
}
不确定是否有更好的方法,我从来没有真正使用过HTTPClients。