C# 使用RESTAPI超时
调用REST服务时如何处理超时问题。 我的GetAsync函数:C# 使用RESTAPI超时,c#,rest,C#,Rest,调用REST服务时如何处理超时问题。 我的GetAsync函数: private async Task<string> GetAsync(string endPoint, string id) { using (var httpClient = new HttpClient()) { SevenMResultNx<string> result = new SevenMResultNx<strin
private async Task<string> GetAsync(string endPoint, string id)
{
using (var httpClient = new HttpClient())
{
SevenMResultNx<string> result = new SevenMResultNx<string>(false);
httpClient.BaseAddress = new Uri(baseAddress);
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(token);
// HTTP GET
HttpResponseMessage response = await httpClient.GetAsync(String.Format("{0}/{1}", endPoint, id));
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return response.ReasonPhrase;
}
}
}
私有异步任务GetAsync(字符串端点,字符串id)
{
使用(var httpClient=new httpClient())
{
SevenMResultNx结果=新的SevenMResultNx(假);
httpClient.BaseAddress=新Uri(BaseAddress);
httpClient.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/json”));
httpClient.DefaultRequestHeaders.Authorization=新系统.Net.Http.Headers.AuthenticationHeaderValue(令牌);
//HTTP获取
HttpResponseMessageResponse=等待httpClient.GetAsync(String.Format(“{0}/{1}”,端点,id));
if(响应。IsSuccessStatusCode)
{
return wait response.Content.ReadAsStringAsync();
}
其他的
{
返回response.reason短语;
}
}
}
这被称为:
Task<string> task = GetAsync(endPoint, id);
var responseGet = task.Result;
Task Task=GetAsync(端点,id);
var responseGet=task.Result;
每当端点不可用时,我都会遇到问题,因为进程会无限等待 我建议让您的方法接受
CancellationToken
,然后您可以将其传递到GetAsync
和ReadAsStringAsync
方法
您可以轻松创建取消令牌,该令牌将在特定时间后过期:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var text = await GetAsync(endpoint, id, cts.Token);
此外,在调用者中使用Result
几乎肯定是一个错误。这意味着,如果您使用的调度程序只有一个线程,则会死锁-您的线程将等待任务完成,但无法完成,因为当httpClient.GetAsync
调用完成时,它需要在同一线程中执行更多代码。两项改进:
- 在等待任务的
方法中,使用GetAsync
,因为您可能不关心异步方法的其余部分在哪个线程上继续ConfigureAwait(false)
- 同时使调用代码异步,并等待返回的任务
CancellationToken
,然后您可以将它传递到GetAsync
和ReadAsStringAsync
方法
您可以轻松创建取消令牌,该令牌将在特定时间后过期:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var text = await GetAsync(endpoint, id, cts.Token);
此外,在调用者中使用Result
几乎肯定是一个错误。这意味着,如果您使用的调度程序只有一个线程,则会死锁-您的线程将等待任务完成,但无法完成,因为当httpClient.GetAsync
调用完成时,它需要在同一线程中执行更多代码。两项改进:
- 在等待任务的
方法中,使用GetAsync
,因为您可能不关心异步方法的其余部分在哪个线程上继续ConfigureAwait(false)
- 同时使调用代码异步,并等待返回的任务
task.Result
——我没有发现。在几乎所有情况下,您都应该使用wait
。但是我们无法判断您是否正确地传递了CancellationToken
——我已经稍微修改了我的答案,因为我没有看到ReadAsStringAsync
调用。我将编辑答案,包括使用wait。这对我不起作用。也许我调用task的方式有错误。@iljon:你不应该这样使用task.Result
——我没有发现。在几乎所有情况下,您都应该使用wait
。但是我们无法判断您是否正确地传递了CancellationToken
——我已经稍微修改了我的答案,因为我没有看到ReadAsStringAsync
调用。我将编辑答案,包括使用wait。