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
相关产品推荐
相关产品推荐

