HttpClient 上的连接和响应的单独超时

Chr*_*ett 9 .net c# http .net-core .net-6.0

HttpClient调用超时/取消的方法有多种:通过设置HttpClient.Timeout属性、传入 a CancellationToken、使用自定义HttpMessageHandler等。所有这些方法的问题是,无论服务器是否满足超时要求,调用都会被取消根本无法联系到或者只是需要更长的时间才能回复。

我想要实现的行为的一个现有示例是 Postman:
当(对于此示例)我的 ASP.NET Core Web API 当前未运行并且我通过 Postman 发送请求时,它会在 5 秒左右后立即停止。但是当我的 Web API 运行时,我通过 Postman 发送请求,然后在代码中命中断点或添加延迟或其他内容,然后 Postman 将等待其设置中指定的毫秒数(= 超过 5 秒)。

这就是我想要的工作。我的 HTTP 请求有两个不同的超时。一种用于等待与服务器的连接,另一种用于等待其响应。如果在等待响应期间与服务器的连接中断时呼叫也会被取消,那就完美了。在 C# 中(使用 .NET 6)是否可以实现类似的功能?如果可以,如何实现?

Mat*_*hew 8

实例化时HttpClient,您可以提供 的实现System.Net.Http.HttpMessageHandler,我相信默认实现是SocketsHttpHandler

SocketsHttpHandler您可以提供连接超时。

var handler = new SocketsHttpHandler
{
    ConnectTimeout = TimeSpan.FromSeconds(5)
};

var client = new HttpClient(handler);

// stuff as usual...
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用健全性检查,因为不能保证如果第一个调用成功,第二个调用也会成功。


Yun*_*iza 1

看起来您可以通过将 的实例传递SocketsHttpHandler给 的构造函数来实现您想要的目的HttpClient

SocketsHttpHandler有一个属性,如果在指定的持续时间过去之前未建立连接,ConnectTimeout则会导致超时。HttpClient

有关更多详细信息,请参阅有关在 HttpClient 中设置超时的Microsoft 官方文档。