用URL,标题,内容和响应来轮询记录所有请求

路易斯·比卡略(Luiz Bicalho)

我有一个项目,该项目从其他项目中调用了许多其他API,并且我遇到了一些问题,不仅要识别这些API的错误,还要识别正确的响应,而在其他系统上信息不正确。我做了这部分,但是它只记录重试,我也需要记录成功。

services.AddHttpClient<IClient, Client>("AuthClient", x =>
    {
        x.BaseAddress = new Uri(urlAn);
    }).AddPolicyHandler((services, request) => 
    HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(
    new[]
    {
        TimeSpan.FromSeconds(1),
        TimeSpan.FromSeconds(5),
        TimeSpan.FromSeconds(10)
    },
    onRetry: (outcome, timespan, retryAttempt, context) =>
    {
        services.GetService<ILogger>()
            .LogWarning("Delaying for {delay}ms, then making retry {retry}.", timespan.TotalMilliseconds, retryAttempt);
    }));
彼得·萨拉

onRetry仅当存在错误(由策略处理)时才执行方法。HandleTransientHttpError触发器政策

  • 要么当有一个 HttpRequestException
  • 或响应码为408或5xxx。

要注入在每种情况下都应执行的逻辑,您需要使用自定义DelegatingHandler通过该扩展点,您可以将自定义代码注入HttpClient的管道(1)。

这是a的天真的实现LoggerHandler

class LoggerHandler: DelegatingHandler
{
    private readonly ILogger<LoggerHandler> _logger;

    public LoggerHandler(ILogger<LoggerHandler> logger)
    {
        _logger = logger;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        try
        {
            var response = await base.SendAsync(request, cancellationToken);
            _logger.LogInformation(response.StatusCode.ToString());
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Request has failed after several retries");
            throw;
        }
    }
}
  • 如您所见,我们已将记录器注入处理程序中
    • 如果下游请求无误,我们会在信息级别记录一些事实
    • 如果下游请求有错误,我们将异常记录在错误级别

现在,让我们连接所有东西:

var retryPolicy = HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(
    new[]
    {
        TimeSpan.FromSeconds(1),
        TimeSpan.FromSeconds(5),
        TimeSpan.FromSeconds(10)
    });

services.AddHttpClient<IClient, Client>("AuthClient", x => { x.BaseAddress = new Uri(urlAn); })
    .AddPolicyHandler(retryPolicy)
    .AddHttpMessageHandler<LoggerHandler>();

请记住注册顺序很重要。

  • 请检查此SO主题以获取更多详细信息。

还有一些细微的事情可以改进:

  • 您无需指定的名称HttpClient,因为您正在使用Typed-Client。
    • services.AddHttpClient<IClient, Client>(x => ...)
  • 我强烈建议使用比IClient更好的命名Client想象一下您需要向应用程序中添加一个客户端的情况。怎么命名呢?AuthClient可能是一个更好的名字:
    • services.AddHttpClient<IAuthClient, AuthClient>(x => ...)
  • 我也鼓励您使用抖动为重试睡眠持续时间添加随机性。如果所有客户端都尝试对过载的服务器执行重试,那么它将对下游没有帮助。
    • 尝试分发带有抖动的重试。
  • 我还建议阅读有关Retry,Timeout和DelegatingHandler的这篇文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用URL,标题,内容和响应来轮询记录所有请求

来自分类Dev

记录对Web服务的所有请求?

来自分类Dev

将所有请求和响应数据记录在tomcat中

来自分类Dev

ServiceStack遍历所有请求/响应DTO

来自分类Dev

ServiceStack遍历所有请求/响应DTO

来自分类Dev

Android,改造捕获所有请求的特定响应代码

来自分类Dev

如何使鱿鱼代理记录所有请求?

来自分类Dev

如何使用VCR记录所有请求?

来自分类Dev

记录每个网页上对用户的所有请求

来自分类Dev

IIS将所有请求重写为静态URL

来自分类Dev

jmeter捕获单个HTTP请求触发的所有请求和响应标头

来自分类Dev

解析JSON以响应现有请求

来自分类Dev

没有请求的Dialogflow响应

来自分类Dev

使用AngularJs从响应中检索标头并在所有请求上进行设置

来自分类Dev

如何将所有请求的500响应返回到Varnish级别的特定文件?

来自分类Dev

如何创建响应所有请求的.NET Framework WebAPI控制器

来自分类Dev

电子:如何捕获主流程中的所有请求响应?

来自分类Dev

如何使iOS应用程序缓存所有请求响应?

来自分类Dev

使用AngularJs从响应中检索标头并在所有请求上进行设置

来自分类Dev

短暂不活动后,IIS Express停止响应所有请求

来自分类Dev

如何获取为页面加载的所有请求的响应正文?

来自分类Dev

如何配置嵌入式码头服务器记录所有请求?

来自分类Dev

我可以使用Flurl.Http记录所有请求吗?

来自分类Dev

如何配置嵌入式码头服务器记录所有请求?

来自分类Dev

S3将所有请求重定向到以请求url作为参数的索引

来自分类Dev

使用FiddlerCore捕获所有请求

来自分类Dev

匹配所有请求的nginx位置

来自分类Dev

Android WorkManager检索所有请求

来自分类Dev

仆人:查看所有请求头

Related 相关文章

  1. 1

    使用URL,标题,内容和响应来轮询记录所有请求

  2. 2

    记录对Web服务的所有请求?

  3. 3

    将所有请求和响应数据记录在tomcat中

  4. 4

    ServiceStack遍历所有请求/响应DTO

  5. 5

    ServiceStack遍历所有请求/响应DTO

  6. 6

    Android,改造捕获所有请求的特定响应代码

  7. 7

    如何使鱿鱼代理记录所有请求?

  8. 8

    如何使用VCR记录所有请求?

  9. 9

    记录每个网页上对用户的所有请求

  10. 10

    IIS将所有请求重写为静态URL

  11. 11

    jmeter捕获单个HTTP请求触发的所有请求和响应标头

  12. 12

    解析JSON以响应现有请求

  13. 13

    没有请求的Dialogflow响应

  14. 14

    使用AngularJs从响应中检索标头并在所有请求上进行设置

  15. 15

    如何将所有请求的500响应返回到Varnish级别的特定文件?

  16. 16

    如何创建响应所有请求的.NET Framework WebAPI控制器

  17. 17

    电子:如何捕获主流程中的所有请求响应?

  18. 18

    如何使iOS应用程序缓存所有请求响应?

  19. 19

    使用AngularJs从响应中检索标头并在所有请求上进行设置

  20. 20

    短暂不活动后,IIS Express停止响应所有请求

  21. 21

    如何获取为页面加载的所有请求的响应正文?

  22. 22

    如何配置嵌入式码头服务器记录所有请求?

  23. 23

    我可以使用Flurl.Http记录所有请求吗?

  24. 24

    如何配置嵌入式码头服务器记录所有请求?

  25. 25

    S3将所有请求重定向到以请求url作为参数的索引

  26. 26

    使用FiddlerCore捕获所有请求

  27. 27

    匹配所有请求的nginx位置

  28. 28

    Android WorkManager检索所有请求

  29. 29

    仆人:查看所有请求头

热门标签

归档