我的HttpClient使用摘要身份驗證連接到服務器,並期望搜索查詢作爲響應。這些搜索查詢可以隨時進行,因此客戶希望始終保持連接的開放。帶有無限超時的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());
}
}
}
這是如何被在控制檯應用程序的主方法中使用的方法。
private static void Main(string[] args)
{
const int serviceId = 128;
.
.
.
ListenForSearchQueries(resourceId);
Console.ReadKey();
}
這是在控制檯窗口中輸出的樣子:
Response code: OK
--searchRequestBoundary
即使客戶端的超時時間設置爲無窮大,連接超時後大約5分鐘(這是不在第一個輸出後,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用於認證是的this代碼粗略適配(參見源部分)。
爲什麼客戶端超時,我該如何防止這種情況發生?
我的最終目標是撥打電話並無限期地等待迴應。當答案確實出現時,我不希望關聯,因爲未來可能會有更多答覆。不幸的是,我不能在服務器端改變任何東西。
避免使用'async void'。這個方法應該用一個'Task'來定義。同時顯示如何調用此方法。 – Nkosi
這似乎是[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你試圖達到的最終目標是什麼? – Nkosi
@Nkosi該方法在控制檯應用程序的主要方法中調用,如下所示:'ListenForSearchQueries(resourceId); Console.ReadKey();' –