我的HttpClient使用摘要验证连接服务器,并期望响应中有搜索查询。这些搜索查询可以随时到来,因此客户端需要始终保持连接打开状态。
使用以下代码建立连接:
使用以下代码建立连接:
public static async void ListenForSearchQueries(int resourceId)
{
var url = $"xxx/yyy/{resourceId}/waitForSearchRequest?token=abc";
var httpHandler = new HttpClientHandler { PreAuthenticate = true };
using (var digestAuthMessageHandler = new DigestAuthMessageHandler(httpHandler, "user", "password"))
using (var client = new HttpClient(digestAuthMessageHandler))
{
client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var request = new HttpRequestMessage(HttpMethod.Get, url);
var tokenSource = new CancellationTokenSource();
tokenSource.CancelAfter(TimeSpan.FromMilliseconds(Timeout.Infinite));
using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, tokenSource.Token))
{
Console.WriteLine("\nResponse code: " + response.StatusCode);
using (var body = await response.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(body))
while (!reader.EndOfStream)
Console.WriteLine(reader.ReadLine());
}
}
}
这是在控制台应用程序的Main方法中使用该方法的方式。
private static void Main(string[] args)
{
const int serviceId = 128;
.
.
.
ListenForSearchQueries(resourceId);
Console.ReadKey();
}
这是控制台窗口上的输出:
Response code: OK
--searchRequestBoundary
尽管客户端的超时时间设置为无限,但在第一次输出大约五分钟后(这不是 HttpClient 的默认超时时间),连接会超时,并抛出以下异常。
尽管客户端的超时时间设置为无限,但在第一次输出大约五分钟后(这不是 HttpClient 的默认超时时间),连接会超时,并抛出以下异常。
System.IO.IOException occurred
HResult=0x80131620
Message=The read operation failed, see inner exception.
Source=System.Net.Http
StackTrace:
at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.Http.DelegatingStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.get_EndOfStream()
at ConsoleTester.Program.<ListenSearchQueriesDigestAuthMessageHandler>d__10.MoveNext() in C:\Users\xyz\ProjName\ConsoleTester\Program.cs:line 270
Inner Exception 1:
WebException: The operation has timed out.
用于身份验证的DelegateHandler是对此代码的粗略适应(请参见源代码部分)。
为什么客户端会超时,我该如何防止这种情况发生?
我的最终目标是进行调用并无限期地等待响应。当响应到来时,我不希望连接关闭,因为未来可能还有更多的响应。不幸的是,在服务器端我不能修改任何东西。
async void
。应该使用Task
定义此方法。同时展示如何调用此方法。 - NkosiListenForSearchQueries(resourceId); Console.ReadKey();
- Ali Zahid错误CS4009:'Program.Main(string [])':入口点不能标记为“async”修饰符
。 - Ali Zahid