Fre*_*son 3 c# abstract-class asynchronous httpclient
我正在尝试创建一个扩展httpclient但仍然是抽象的类.
public abstract class Repository : HttpClient
{
public override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//retry logic here
var response = await base.SendAsync(request, cancellationToken);
while (!IsValid(response))
{
Attempts++;
response = await Retry(request, cancellationToken);
}
Attempts = 0;
return response;
}
public int Attempts { get; set; }
public abstract bool IsValid(HttpResponseMessage response);
public abstract Task<HttpResponseMessage> Retry(HttpRequestMessage request, CancellationToken cancellationToken);
public abstract Type GetPageForUri(Uri uri);
public abstract Task<object> GetItems(Uri uri);
}
Run Code Online (Sandbox Code Playgroud)
但是当子类调用getStringAsync时,它不会在Repository中调用SendAsync
public class EmailClient : Repository
{
public override bool IsValid(HttpResponseMessage response)
{
return response.IsSuccessStatusCode;
}
public override Task<HttpResponseMessage> Retry(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken);
}
public override Type GetPageForUri(Uri uri)
{
return typeof(EmailPage);
}
public override async Task<object> GetItems(Uri uri)
{
var emails = await GetStringAsync(uri);
return emails;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么做错了?我应该制作一个HttpClientHandler并将其包含在HttpClient中吗?香港专业教育学院试图阅读虚拟,如果这有任何不同.但我不明白它为什么不被调用.谁能帮我?
Ric*_*lay 10
HttpClient是一个HttpMessageHandler实现的瘦包装器(通常HttpClientHandler,大多数运行时实现支持的功能的属性)
实际上有一个HttpMessageHandler用于装饰器的基类,比如你的重试场景,DelegatingHandler你可以像这样实现:
就像是:
public class RetryMessageHandler : DelegatingHandler
{
readonly int retryCount;
public RetryMessageHandler(int retryCount)
: this(new HttpClientHandler(), retryCount)
{
}
public RetryMessageHandler(HttpMessageHandler innerHandler, int retryCount)
: base(innerHandler)
{
this.retryCount = retryCount;
}
public override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
for (int i = 0; i<=retryCount; i++)
{
response = await base.SendAsync(request, cancellationToken);
if (response.IsSuccessStatusCode)
{
return response;
}
}
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你将使用这样:
HttpClient httpClient = HttpClientFactory.CreatePipeline(new HttpClientHandler(),
new [] { new RetryMessageHandler(3) });
var response = await httpClient.SendAsync(request);
Run Code Online (Sandbox Code Playgroud)
另外,我建议你的EmailClient换行/取决于HttpClient,而不是扩展它.(谷歌"构成与继承"了解更多有关原因的信息)
| 归档时间: |
|
| 查看次数: |
5354 次 |
| 最近记录: |