【发布时间】:2018-01-23 20:38:12
【问题描述】:
我有一个如下所示的 Web API 控制器:
[Route("api/[controller]")]
public class SlowController : Controller
{
[HttpPost]
public ActionResult Post([FromBody]SlowRequest request)
{
var response = new SlowResponse();
response.Id = request.Id;
response.StartDate = DateTime.Now;
Thread.Sleep(new TimeSpan(0, 3, 0));
response.EndDate = DateTime.Now;
return Ok(response);
}
}
注意如何有 3 分钟的睡眠。这是为了模拟post动作需要很长时间才能返回。
我有一个调用此 Web API 的客户端控制台应用程序:
static void Main(string[] args)
{
try
{
var request = new SlowRequest();
request.Id = Guid.NewGuid();
var json = JsonConvert.SerializeObject(request);
var httpClient = new HttpClient();
httpClient.Timeout = new TimeSpan(0, 5, 0);
httpClient.BaseAddress = new Uri("http://localhost:54316/");
var result = httpClient.PostAsync("api/slow", new StringContent(json, Encoding.UTF8, "application/json")).Result.EnsureSuccessStatusCode();
var apiResponse = result.Content.ReadAsStringAsync().Result;
var response = JsonConvert.DeserializeObject<SlowResponse>(apiResponse);
Console.WriteLine("Start Time = " + response.StartDate);
Console.WriteLine("End Time = " + response.EndDate);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
不幸的是,客户端在 2 分钟后抛出异常:
响应状态码不表示成功:502(网关错误)。
似乎如果 API 需要超过 2 分钟才能返回这个,就会发生异常。不到 2 分钟,它工作得很好。尽管我已经在客户端设置了 5 分钟的超时时间。如何防止需要很长时间的 Web API 调用出现这样的错误?
【问题讨论】:
-
提示:与其使用构造函数
new TimeSpan(0, 5, 0),不如使用静态方法TimeSpan.FromMinutes(5)看起来更好、更容易阅读。
标签: c# .net asp.net-web-api dotnet-httpclient