【问题标题】:Set automatic timeout based on number of http requests sent根据发送的 http 请求数设置自动超时
【发布时间】:2017-04-19 12:48:53
【问题描述】:

我正在尝试为使用 C# 作为可移植 dll 的 UWP 应用程序开发 http 代理服务器。但是,重试超时为 60 秒,与发送的请求数无关,例如发送了 4 个请求,但如果它必须重试对于少量任务,我必须等待 60 秒。有什么方法可以自动执行此重试超时,以便根据请求数量使用最佳超时,也许可以使用全局声明的东西并在sendasync(用于发送请求)?

【问题讨论】:

  • 你好杰!我真的很抱歉没有给你更新我的问题。我正在使用 system.net.http.httpclient ,是的,我理解您要传达的内容,我将 sendasync 方法中重试请求之前的超时设置为 60 秒,当我发送一些请求时说 4 我想要它可能在 20 秒后退休。这是我需要根据请求数自动重试超时的地方。
  • 超时只能在发送请求前设置。如果您的请求已发送,则无法更改超时时间。
  • 哦,对不起,Jay,我想你误解了我。我认为我最好通过一个例子来演示。现在说我正在发送 N 个请求,如果 N>30,超时是 60 秒,超时是如果 N
  • 那么你应该可以使用一个全局变量来存储你要发送的请求的数量,然后根据数量设置取消令牌。

标签: c# uwp httprequest httpclient proxy-server


【解决方案1】:

在 UWP 中,我们可以使用两个HttpClient 来发送 HTTP 请求。它们是System.Net.Http.HttpClientWindows.Web.Http.HttpClient。我不确定你用的是哪一个。

对于System.Net.Http.HttpClient,有两种设置超时的方法。要为该客户端发出的所有请求设置超时,我们可以使用HttpClient.Timeout 属性:

var myClient = new System.Net.Http.HttpClient();
myClient.Timeout = TimeSpan.FromSeconds(30);

要为单个请求设置超时,请使用取消令牌模式:

var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(30));

var httpClient = new System.Net.Http.HttpClient();
var resourceUri = new Uri("http://www.contoso.com");

try
{
   HttpResponseMessage response = await httpClient.GetAsync(resourceUri, cts.Token);
}
catch (TaskCanceledException ex)
{
   // Handle request being canceled due to timeout.
}
catch (HttpRequestException ex)
{
   // Handle other possible exceptions.
}

对于Windows.Web.Http.HttpClient,Windows.Web.Http.HttpClient 类型上没有超时属性。因此,您必须使用上面显示的取消令牌模式。

var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(30));

var httpClient = new Windows.Web.Http.HttpClient();
var resourceUri = new Uri("http://www.contoso.com");

try
{
    var response = await httpClient.GetAsync(resourceUri).AsTask(cts.Token);
}
catch (TaskCanceledException ex)
{
    // Handle request being canceled due to timeout.
}
catch (Exception ex)
{
    // Handle other possible exceptions.
}

更多信息,请查看Demystifying HttpClient APIs in the Universal Windows Platform

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多