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

Swagger生成C# REST客户端抛ApiException时如何获取HTTP响应头

C# Swagger生成客户端ApiException获取Retry-After响应头方案

首先明确主流Swagger C#客户端的两种生成工具对应处理方式:

NSwag生成客户端处理方式

NSwag默认生成的ApiException自带Headers只读字典属性,可直接取值:

try
{
    // 调用生成的客户端接口方法
    await _generatedClient.GetTargetDataAsync();
}
catch (ApiException ex) when (ex.StatusCode == 429)
{
    if (ex.Headers.TryGetValue("Retry-After", out var retryAfterValues))
    {
        int retryAfterSeconds = int.Parse(retryAfterValues.First());
        // 执行重试逻辑
    }
}

如果你的ApiException无该属性,检查NSwag生成配置的GenerateExceptionHeaders开关,确认该配置为开启状态(默认值为true)。

OpenAPI Generator生成客户端处理方式

OpenAPI Generator生成的ApiException默认提供ResponseHeaders属性存储响应头:

try
{
    await _generatedClient.GetTargetDataAsync();
}
catch (ApiException ex) when (ex.StatusCode == 429)
{
    if (ex.ResponseHeaders.TryGetValue("Retry-After", out var retryAfterValues))
    {
        string retryAfter = retryAfterValues.FirstOrDefault();
        // 解析为对应时间间隔即可
    }
}

如果无该属性,可自定义ApiException生成模板,在构造函数中增加响应头参数并公开为公共属性,后续生成时复用自定义模板即可。

通用兜底处理方案

如果以上属性都不存在,可通过反射读取异常内部存储的Http响应对象获取头信息:

catch (ApiException ex)
{
    var responseField = ex.GetType()
        .GetField("_response", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    if (responseField?.GetValue(ex) is HttpResponseMessage response)
    {
        var retryAfterHeader = response.Headers.RetryAfter;
        if (retryAfterHeader != null)
        {
            TimeSpan retryAfter = retryAfterHeader.Delta ?? 
                retryAfterHeader.Date.Value.Subtract(DateTimeOffset.Now);
            // 执行重试逻辑
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:54:03