2017-04-19 151 views
-1

我正在尝试为使用C#作为可移植dll的UWP应用程序开发一个http代理服务器。但是,重试超时是60秒,与发送的请求数无关,发送了4个请求,但是如果必须重试,我必须等待60秒才能完成少量任务。是否有任何方法可以自动执行此重试超时,从而根据请求数量使用最佳超时值,全局声明可以在sendasync中使用和调用(用于发送请求)?根据发送的http请求数设置自动超时

+0

Hello Jay!我很抱歉没有给你提供我的问题的更新。我使用的是system.net.http.httpclient,是的,我明白你要传达的是什么,我将sendasync方法中的请求重试前的超时时间设置为60秒,当我发送一些请求时说4我希望它可能会在20秒后退出。这是我需要根据请求数自动执行重试超时的地方。 –

+0

超时只能在发送请求前设置。如果您的请求已发送,则无法更改超时。 –

+0

对不起周杰伦我觉得你误解了我。我认为最好我通过一个例子来演示。现在说我正在发送N个请求,因为如果N> 30,超时时间是60秒,如果N <30,超时时间是30秒,更具体的东西。我需要为这个逻辑或更具体的东西实现代码。你可以给我你的电子邮件ID,以便我可以提供更多的细节? –

回答

0

在UWP中,有两个我们可以用来发送HTTP请求的HttpClient。他们是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