服务器强制关闭HttpClient时如何进行trap

Posted

技术标签:

【中文标题】服务器强制关闭HttpClient时如何进行trap【英文标题】:How to trap when server forcebly closes HttpClient 【发布时间】:2021-11-16 02:39:32 【问题描述】:

鼓励重复使用 HttpClient 而不是为每个 api 调用创建一个新的。 https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

我的客户端程序有一个保持打开的连接。 但是,如果有人停止 IIS,则连接将无法保持打开状态。

在这种情况下,我得到一个异常,它会杀死我的客户端程序,即使我有一个捕获它。 (见代码)

有没有办法让异常处理程序处理异常而不会使程序崩溃?

或者,HttpClient是否有一些属性表明服务器已经关闭它?

try

    return await m_Client.GetAsync(AppVars.Instance.ServerAddress + method);

catch (Exception ex)

  // getting 'An existing connection was forcibly closed by the remote host' kills the 
  // application

  // getting 'No connection could be made because the target machine actively refused it'
  // does not kill the application - i.e. catch behaves as expected

【问题讨论】:

为什么捕获异常会杀死应用程序? 通过 http 请求,连接得到服务或出现故障,但不能永远参与单个客户端。如果您的连接由于某种原因关闭,那么您应该在代码级别应用一些重试机制。 @mm8 我不认为捕获异常会杀死应用程序。我的猜测是 HttpClient 正在做一些额外的事情,当异常发生时会杀死应用程序。 所以它会抛出一个异常,你捕获 并且 也会杀死应用程序?我对此表示怀疑。 @Manti_Core - 但由于应用程序被终止,我无法捕捉到连接何时被切断。 【参考方案1】:

我发现这是由 Visual Studio 引起的。我正在从一个解决方案(多个启动项目)调试客户端和服务器。当我关闭 IIS Express 时,Visual Studio 会在下次尝试使用连接时终止客户端。如果我启动一个单独的 Visual Studio 实例并从那里调试客户端,那么当我尝试重新使用关闭的连接时,客户端不会被杀死,即异常处理按预期工作。 (这样我就可以建立新的连接并重试)

希望这对遇到同样问题的人有所帮助。

【讨论】:

以上是关于服务器强制关闭HttpClient时如何进行trap的主要内容,如果未能解决你的问题,请参考以下文章

写入响应标头后服务器关闭连接时的 HttpClient 异常

使用 System.Net.HttpClient 进行上传时如何跟踪进度? [复制]

如何强制 ROScompressed_image_transport 使用 libturbojpeg 进行 jpeg 压缩?

总结httpclient资源释放和连接复用

如何保证 docker 后台进程重启,而不引起容器关闭

如何保证 docker 后台进程重启,而不引起容器关闭