首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DelegatingHandler实现HTTP请求重试逻辑

使用DelegatingHandler实现HTTP请求重试逻辑
EN

Stack Overflow用户
提问于 2019-08-05 07:03:14
回答 1查看 1.7K关注 0票数 1

我正在尝试使用DelegatingHandler实现重试,但我也希望设置HttpCompletionOption。

我的代码如下所示:

代码语言:javascript
复制
public class RetryHandler : DelegatingHandler
{
    private readonly int MaxRetries;

    public RetryHandler(HttpMessageHandler innerHandler, int retryCount = 3)
        : base(innerHandler)
    {
        MaxRetries = retryCount;
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        HttpResponseMessage response = null;
        for (var i = 0; i < MaxRetries; i++)
        {
            response = await base.SendAsync(request, cancellationToken);
            if (response.IsSuccessStatusCode)
            {
                return response;
            }
        }

        return response;
    }
}

    static void Main(string[] args)
    {
        using (var client = new HttpClient(new RetryHandler(new HttpClientHandler())))
        {
            var request = new HttpRequestMessage(HttpMethod.Post, "https://ptsv2.com/t/smz9v-1564979884/post");
            var myResult = client.SendAsync(request).Result;
            Console.WriteLine(myResult.ToString());
        }

        Console.ReadLine();
    }

正如您所看到的,没有通过继承HttpCompletionOption来设置DelegatingHandler的选项,我尝试创建CustomDelegatinghandler,但是在这种情况下,我无法像在主方法中使用的那样使用新RetryHandler(新HttpClientHandler())

是否有任何方法实现具有/支持以下签名的DelegatingHandler(或自定义)?

代码语言:javascript
复制
protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, HttpCompletionOption option,
        CancellationToken cancellationToken)

任何帮助都将不胜感激。谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-05 08:47:56

您不需要在消息处理程序签名中包括HttpCompletionOption,因为处理HttpCompletionOptionHttpClient的责任,而不是HttpMessageHandler的责任。

HttpMessageHandler必须启动发送请求的任务,并尽早返回Task<HttpResponseMessage>。通常,它不应该对响应内容执行任何缓冲(除非它是为缓冲目的创建的中间件),这就是为什么它不接收HttpCompletionOption。它应该始终表现为它是通过HttpCompletionOption.ResponseHeadersRead的。

指定HttpCompletionOption的预期方法是将其包含在对HttpClient方法的重载(如GetAsyncSendAsync )的调用中。

代码语言:javascript
复制
client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

粗略地说,HttpClient处理HttpCompletionOption的方法如下:

  1. 调用消息处理程序并获取Task<HttpResponseMessage> (见代码)
  2. 如果指定了HttpCompletionOption.ResponseHeadersRead,则完成:将任务返回给调用方(见代码)
  3. 如果指定了HttpCompletionOption.ResponseContentRead,则返回HttpContent.LoadIntoBufferAsync的任务,作为原始Task<HttpResponseMessage> (见代码)的延续。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57353651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档