如何从webApi上的http请求中检索CancellationToken?

时间:2019-01-17 09:41:35

标签: c# asp.net-core asp.net-core-webapi dotnet-httpclient asp.net-core-2.1

我正在通过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响应之前停止请求(关闭客户端),则不会引发异常。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

找到了魂。.

实际上,我们不需要通过客户端传递取消托克,MVC会自动进行。

MVC将使用CancellationTokenModelBinder将操作方法​​中的任何CancellationToken参数自动绑定到HttpContext.RequestAborted令牌。当您在Startup.ConfigureServices()中调用services.AddMvc()(或services.AddMvcCore())时,将自动注册该模型绑定程序。

来源:andrewlock.net