我正在通过HttpClient向服务器发送请求,
public async Task GetTest()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
string url = String.Format($"api/Test/getTest");
HttpResponseMessage response = await _httpClientFactory.HttpClient.GetAsync(url, tokenSource.Token).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
}
在WebApi(Core 2.1)上,方法是这样的:
[HttpGet("getTest")]
public async Task<IActionResult> GetTest(CancellationToken token)
{
try
{
object test = await _dataService.GetTest(token);
return Ok(test);
}
catch (Exception ex)
{
this._logger.LogError(ExceptionHelper.ExMessageDeepGet(ex));
return new InternalServerErrorWithMessageResult(ex);
}
}
在_dataService.GetTest(token)
中,我做token.ThrowIfCancellationRequested();
问题是我在webapi上获得了新令牌,而不是通过客户端发送的令牌,因此,如果在api响应之前停止请求(关闭客户端),则不会引发异常。
有什么建议吗?
答案 0 :(得分:0)
找到了魂。.
实际上,我们不需要通过客户端传递取消托克,MVC会自动进行。
MVC将使用CancellationTokenModelBinder将操作方法中的任何CancellationToken参数自动绑定到HttpContext.RequestAborted令牌。当您在Startup.ConfigureServices()中调用services.AddMvc()(或services.AddMvcCore())时,将自动注册该模型绑定程序。