网站留言板作用,网站建设-纵横网络,企业网站帮助中心,温州市人才市场招聘网最新招聘在某些情况下#xff0c;WEB API 可能需要很长时间来处理请求#xff0c;而客户端如果一直等待工作完成是不可行的#xff0c;比如连接超时等。这时#xff0c;可以使用“异步 Request-Reply 模式”。异步 Request-Reply 模式异步 Request-Reply 模式是指#xff1a;在后端… 在某些情况下WEB API 可能需要很长时间来处理请求而客户端如果一直等待工作完成是不可行的比如连接超时等。这时可以使用“异步 Request-Reply 模式”。异步 Request-Reply 模式异步 Request-Reply 模式是指在后端处理需要是异步处理但前端仍需要明确响应的情况下将后端处理与前端分离。整体流程如下:客户端应用程序对业务 API 进行调用在后端触发长时间运行的操作;API 立即返回响应。返回 HTTP 202 Accepted (接受) 状态码确认已收到请求进行处理响应包含一个标头包含了客户端可以轮询状态的 API 地址以检查长时间运行的操作的结果;客户端轮询这个状态 API如果操作未完成则返回 HTTP 202否则返回 HTTP 200, 并包含实际的响应数据。下面我们来演示如何在 ASP.NET Core 中实现。Demo我们用等待20秒模拟一个长时间 API 操作[HttpGet]
[Route(get)]
public async TaskIEnumerableWeatherForecast Get()
{await Task.Delay(20000);var rng new Random();return Enumerable.Range(1, 5).Select(index new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC rng.Next(-20, 55),Summary Summaries[rng.Next(Summaries.Length)]}).ToArray();
}首先我们创建一个新 API 操作[HttpGet]
[Route(async/get)]
public async TaskIActionResult AsyncGet()
{string id Guid.NewGuid().ToString();string responseValue $/status/{id};_cache.SetString(id, responseValue);Task.Factory.StartNew(() {var result Get().Result;_cache.SetString(id _result, JsonConvert.SerializeObject(result));});return Accepted(responseValue);
}具体作用就是把长时间交由 Task 执行执行结果将放到分布式缓存中然后立刻返回 HTTP 202 Accepted。客户端不再访问原来的请求地址而是使用此新地址然后我们创建一个状态 API 用于轮询[HttpGet]
[Route(/status/{id})]
public IActionResult Status(string id)
{var result _cache.GetString(id _result);if (!string.IsNullOrEmpty(result)){return Ok(result);}return Accepted(_cache.GetString(id));
}客户端根据 ID 进行轮询。当操作还未完成时继续返回 HTTP 202当操作完成时返回分布式缓存中的结果结论如果你的 API 有长时间运行的操作应将轮询信息尽快地返回给调用方以便他们可以检查进度。想了解更多内容请关注我的个人公众号”My IO“