我正在做GET请求,我不想关闭Response流。如果没有什么可读,我想等到有。如何保持流,同时在单个GET请求后保持打开状态?
这是我正在提出的要求。我目前正在使用ContinueWith来读取初始响应,但是发布之间的时间太长而且流最终关闭。
streamer = new HttpClient()
{
BaseAddress = new Uri("http://" + url + "/")
};
var get = streamer.GetStreamAsync(streamer.BaseAddress + "!" + Uri.EscapeDataString(query));
答案 0 :(得分:1)
您必须定期将一些NOP数据发布到流中。在您的客户端中,您忽略NOP并仅处理返回的其他数据。
但是,我想指出这是一个坏主意 - 这不是HTTP的用途。 HTTP是围绕具有响应的请求构建的,就像那样简单。
如果由于某种原因确实需要使用HTTP(例如,您的服务器在Web托管上,或者您需要使用80端口),发送某些数据或多或少是唯一的办法。你也可以指定更大的超时,但它在实践中并没有太大的帮助。另一种方法是在客户端进行定期轮询,但实现起来可能要困难得多 - 但它确实更适合HTTP模型。更合理的方式可以是使用例如SignalR,允许您使用客户端上的观察者自动从服务器接收数据。
最后,请注意没有保证。 HTTP不是为此而设计的,并且它本身就不稳定。它旨在提供全球Web服务,代理和本地缓存以及什么不是。您必须确保不使用缓存,并且您必须准备好关闭响应,就这么简单。它可以在任何时间发生,因此可以例如应用程序池重新启动。准备好优雅地处理所有这些情况。
答案 1 :(得分:0)
您可以为该线程创建一个新线程和一个函数,在该函数中,您可以创建一个无限循环,最后一次休眠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。