我正在实施一个依赖Office365 API Streaming Subscriptions的应用程序。在收听订阅时,我正在阅读POST请求几乎无限的结果。实际上我正在获得一个包含单个JSON对象的流,该对象以一些预热属性开始并具有一系列事件。
我正在使用JsonTextReader来解析流。有一个while (await jsonReader.ReadAsync(readCts.Token))...
循环可以无缝地解析流。
它工作得很好......好吧,差不多。
在预定义的时间间隔内,我收到KeepAlive通知。读者正在识别它们,因此我想使用它来重置readCts
CancellationTokenSource超时。如果当时没有到达通知,则应取消读取操作。到现在为止还挺好。但基于超时的取消仅在底层网络连接正常时才起作用(通过设置超时小于keepalive事件间隔来模拟)。
中断连接后,此异步操作挂起,取消令牌对其没有影响。并且逻辑连接也会丢失,重新建立物理连接不会恢复流。
我已经尝试过设置HttpClient实例的超时,但这也没有任何影响。最后,我通过设置WinHttpHandler.ReceiveDataTimeout
来管理它。但为此,我正在使用一个单独的HttpClient实例。
1)上述取消行为是否正常? 2)我知道,应该重用HttpClient实例。但通常API调用不会运行数小时。我可能会同时进行几次这样的调用。我可以共享一个HttpClient实例,还是需要和我一样多的并行请求?
谢谢。