使用HttpClientHandler设置超时

时间:2017-09-22 23:14:39

标签: c# anglesharp

我正在尝试使用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);

我看不到任何可用于设置超时的属性。如何设置超时?

2 个答案:

答案 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)

有时需要在HttpClientHttpClientHandler级别设置不同的超时时间,例如某种重试逻辑,对于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(...);