服务器强制关闭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 压缩?