You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 4.8.1中如何通过Refit设置HttpClient的连接超时?

为Refit设置连接超时与请求处理超时

Refit 基于 HttpClient 实现,因此需要通过配置 HttpClient 及其底层 Handler 来区分连接建立阶段超时和请求处理阶段超时,满足你连接超时30秒、请求处理最多1分钟的需求。

方法一:使用 SocketsHttpHandler 分离超时设置(推荐,.NET Core 2.1+ / .NET 5+)

SocketsHttpHandler 提供了 ConnectTimeout 属性,专门控制连接建立(DNS解析、TCP握手)的最长时间,同时配合 HttpClient 的 Timeout 设置总请求时长(连接超时 + 处理超时)。

  1. 配置 SocketsHttpHandler:
var socketHandler = new SocketsHttpHandler
{
    ConnectTimeout = TimeSpan.FromSeconds(30), // 连接阶段超时30秒
    // 可选:配置连接池参数,按需调整
    PooledConnectionLifetime = TimeSpan.FromMinutes(5),
    PooledConnectionIdleTimeout = TimeSpan.FromMinutes(2)
};
  1. 创建 HttpClient 并设置总超时:
    总超时需覆盖连接超时+请求处理时间,这里设置为90秒(30秒连接+60秒处理):
var httpClient = new HttpClient(socketHandler)
{
    BaseAddress = new Uri("https://your-api-domain.com/"),
    Timeout = TimeSpan.FromSeconds(90)
};
  1. 初始化 Refit 接口实例:
var apiClient = RestService.For<IMyApiInterface>(httpClient);

方法二:用 Polly 单独控制请求处理超时(更精细)

如果需要确保连接成功后,请求处理阶段最多耗时1分钟(不受连接耗时影响),可以结合 Polly 超时策略,关闭 HttpClient 的总超时,让 Polly 单独管控处理阶段时长:

  1. 添加 Polly NuGet 包:Microsoft.Extensions.Http.Polly

  2. 配置 SocketsHttpHandler 和 Polly 策略:

// 连接超时设置
var socketHandler = new SocketsHttpHandler
{
    ConnectTimeout = TimeSpan.FromSeconds(30)
};

// Polly 超时策略:请求处理阶段最多60秒
var processingTimeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(60));

// 创建带策略的 HttpClient
var httpClient = new HttpClient(new PolicyHttpMessageHandler(processingTimeoutPolicy)
{
    InnerHandler = socketHandler
})
{
    BaseAddress = new Uri("https://your-api-domain.com/"),
    Timeout = Timeout.InfiniteTimeSpan // 关闭 HttpClient 总超时
};

// 初始化 Refit
var apiClient = RestService.For<IMyApiInterface>(httpClient);

.NET Framework 兼容方案

如果使用 .NET Framework,SocketsHttpHandler 不可用,需通过 ServicePointManager 设置连接超时:

// 设置目标域名的连接超时为30秒(单位毫秒)
ServicePointManager.FindServicePoint(new Uri("https://your-api-domain.com/")).ConnectionTimeout = 30000;

var httpClient = new HttpClient
{
    BaseAddress = new Uri("https://your-api-domain.com/"),
    Timeout = TimeSpan.FromSeconds(90) // 总超时90秒
};

var apiClient = RestService.For<IMyApiInterface>(httpClient);

内容的提问来源于stack exchange,提问作者NightCity10932

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:55:22