我正在尝试使用DelegatingHandler实现重试,但我也希望设置HttpCompletionOption。
我的代码如下所示:
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(或自定义)?
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, HttpCompletionOption option,
CancellationToken cancellationToken)任何帮助都将不胜感激。谢谢,
发布于 2019-08-05 08:47:56
您不需要在消息处理程序签名中包括HttpCompletionOption,因为处理HttpCompletionOption是HttpClient的责任,而不是HttpMessageHandler的责任。
HttpMessageHandler必须启动发送请求的任务,并尽早返回Task<HttpResponseMessage>。通常,它不应该对响应内容执行任何缓冲(除非它是为缓冲目的创建的中间件),这就是为什么它不接收HttpCompletionOption。它应该始终表现为它是通过HttpCompletionOption.ResponseHeadersRead的。
指定HttpCompletionOption的预期方法是将其包含在对HttpClient方法的重载(如GetAsync或SendAsync )的调用中。
client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);粗略地说,HttpClient处理HttpCompletionOption的方法如下:
https://stackoverflow.com/questions/57353651
复制相似问题