我正在尝试使用HttpClientHandler设置anglesharp.io的超时值。
此问题表明有可能:https://github.com/AngleSharp/AngleSharp/issues/266
我得到这样的页面:
NetworkCredential proxyCreds = new NetworkCredential(proxy.User, proxy.Pass);
WebProxy wProxy = new WebProxy(proxy.Ip + ":" + proxy.Port, false)
{
UseDefaultCredentials = false,
Credentials = proxyCreds,
};
HttpClientHandler httpClientHandler = new HttpClientHandler()
{
Proxy = wProxy,
PreAuthenticate = true,
UseDefaultCredentials = false
};
var config = Configuration.Default.WithRequesters(httpClientHandler);
var document = await BrowsingContext.New(config).OpenAsync(address);
我看不到任何可用于设置超时的属性。如何设置超时?
答案 0 :(得分:1)
以上评论是对的。 AngleSharp正在抽象请求者 - 允许多种类型的请求者,并在需要时提供灵活性。基本接口是install
(注意:没有故意的HTTP - 在AngleSharp中。我们也发现,例如,IRequester
访问本地文件系统的file:// URIs。 / p>
我们现在可以实现我们自己的请求者,或者只使用AngleSharp.Io中的FileRequester
和构造函数重载接受HttpClientRequester
实例。
HttpClient
现在的问题是你如何使用这个请求者?我们只是创建一个配置(像往常一样)并使用默认的加载器扩展方法(像往常一样),但这次是我们的自定义请求者:
var client = new HttpClient();
client.Timeout = MyCustomTimeout; //Whatever value you want it to be
var requester = new HttpClientRequester(client);
希望这有帮助!
答案 1 :(得分:0)
有时需要在HttpClient
和HttpClientHandler
级别设置不同的超时时间,例如某种重试逻辑,对于HttpClient
是无缝的-等待5分钟,但每分钟重试。在这种情况下,可以使用如下所示的委托处理程序:
public class RetryHandler : DelegatingHandler
{
private readonly TimeSpan timeout;
public RetryHandler(TimeSpan timeout)
{
this.timeout = timeout;
}
private async Task<HttpResponseMessage> Delay(
CancellationToken cancellationToken)
{
await Task.Delay(timeout, cancellationToken);
return null;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
for (; ; )
{
cancellationToken.ThrowIfCancellationRequested();
var delayTask = Delay(cancellationToken);
var firstCompleted = await Task.WhenAny(
base.SendAsync(request, cancellationToken), delayTask);
if (firstCompleted != delayTask)
return await firstCompleted;
}
}
}
用例:
var client = new HttpClient(
new RetryHandler(TimeSpan.FromMinutes(1)))
{
Timeout = TimeSpan.FromMinutes(5)
};
client.PostAsync(...);