当前位置: 首页 > 编程语言 > C#

具有无限超时的HttpClient会抛出超时exception分享

时间:2023-04-10 17:55:19 C#

C#学习教程:具有无限超时的HttpClient抛出超时异常这些搜索查询可以随时进来,因此客户端应始终保持连接打开。使用以下代码建立连接:publicstaticasyncvoidListenForSearchQueries(intresourceId){varurl=$"xxx/yyy/{resourceId}/waitForSearchRequest?token=abc";varhttpHandler=newHttpClientHandler{PreAuthenticate=true};使用(vardigestAuthMessageHandler=newDigestAuthMessageHandler(httpHandler,“用户”,“密码”))使用(varclient=newHttpClient(digestAuthMessageHandler)){client.Timeout=TimeSpan.FromMilliseconds(Timeout.Infinite);varrequest=newHttpRequestMessage(HttpMethod.Get,url);vartokenSource=newCancellationTokenSource();tokenSource.CancelAfter(TimeSpan.FromMilliseconds(Timeout.Infinite));使用(varresponse=awaitclient.SendAsync(request,HttpCompletionOption.ResponseHeadersRead,tokenSource.Token)){Console.WriteLine("nResponsecode:"+response.StatusCode);使用(varbody=awaitresponse.Content.ReadAsStreamAsync())使用(varreader=newStreamReader(body))while(!reader.EndOfStream)Console.WriteLine(reader.ReadLine());这是在控制台应用程序的Main方法中使用的方法privatestaticvoidMain(string[]args){constintserviceId=128;...ListenForSearchQueries(resourceId);控制台.ReadKey();控制台窗口的输出如下所示:响应代码:OK--searchRequestBoundary即使客户端的超时设置为无穷大,连接在第一次输出后大约需要五分钟(这不是HttpClient的默认超时)超时后,抛出以下异常。发生System.IO.IOExceptionHResult=0x80131620Message=读取操作失败,请参阅内部异常。Source=System.Net.HttpStackTrace:在System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[]缓冲区,Int32偏移量,Int32计数)在System.Net.Http.DelegatingStream.Read(Byte[]缓冲区,Int32偏移量,Int32计数)在System.IO.StreamReader.ReadBuffer()在System.IO.StreamReader.get_EndOfStream()在ConsoleTester.Program。d__10.MoveNext()inC:UsersxyzProjNameConsoleTesterProgram.cs:line270内部异常1:WebException:操作超时。用于身份验证的DelegateHandler是对这段代码的粗略调整(请参阅源代码部分)。为什么客户端超时,我该如何防止这种情况发生?我的最终目标是拨打电话并无限期地等待回复。当响应确实到来时,我不希望关闭连接,因为将来可能会有更多响应。不幸的是,我无法在服务器端进行任何更改。虽然Stream.CanTimeout的默认值为false,但通过response.Content.ReadAsStreamAsync()返回的流会给出CanTimeout属性返回true的流。此流的默认读写超时为5分钟。这是在五分钟不活动后,流将抛出异常。与问题中显示的异常非常相似。要更改此行为,您可以调整流的ReadTimeout和/或WriteTimeout属性。下面是ListenForSearchQueries方法的修改版本,其中ListenForSearchQueriesReadTimeout更改为Infinite。publicstaticasyncvoidListenForSearchQueries(intresourceId){varurl=$"xxx/yyy/{resourceId}/waitForSearchRequest?token=abc";varhttpHandler=newHttpClientHandler{PreAuthenticate=true};使用(vardigestAuthMessageHandler=newDigestAuthMessageHandler(httpHandler,“用户”,“密码”))使用(varclient=newHttpClient(digestAuthMessageHandler)){client.Timeout=TimeSpan.FromMilliseconds(Timeout.Infinite);varrequest=newHttpRequestMessage(HttpMethod.Get,url);vartokenSource=newCancellationTokenSource();tokenSource.CancelAfter(TimeSpan.FromMilliseconds(Timeout.Infinite));使用(varresponse=awaitclient.SendAsync(request,HttpCompletionOption.ResponseHeadersRead,tokenSource.Token)){Console.WriteLine("nResponsecode:"+response.StatusCode);使用(varbody=awaitresponse.Content.ReadAsStreamAsync()){body.ReadTimeout=Timeout.Infinite;使用(varreader=newStreamReader(body))while(!reader.EndOfStream)Console.WriteLine(reader.ReadLine());这修复了实际上由流抛出的异常,但似乎是由HttpClient抛出的,使该方法返回一个任务publicstaticasyncTaskListenForSearchQueries(intresourceId){//...为简洁起见删除了代码}的更新控制台的主要方法是使用WaitTask完成。以上就是C#学习教程:无限超时的HttpClient会抛出超时异常的全部内容分享。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——publicstaticvoidMain(string[]args){constintserviceId=128;...ListenForSearchQueries(resourceId).Wait();控制台.ReadKey();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: