如何将CancellationToken传递给WebApi操作?

时间:2019-01-12 09:41:43

标签: c# asp.net-web-api async-await asp.net-web-api2

我正在向WebApi发送请求,如下所示:

var response = client.PostAsJsonAsync(url, dto).Result;

我在控制器操作中使用HostingEnvironment,所以我可以在后台线程中完成工作,并将IIS的取消令牌传递给我的服务方法,如下所示:

public IHttpActionResult MyAction(SearchDto dto)
{
    HostingEnvironment.QueueBackgroundWorkItem(async ct =>
    {
        //Do background work
        var result = await myService.DoWorkAsync(dto, ct);
    });

    return Ok();
}

现在,我想传递来自客户端的取消令牌,以便用户可以取消请求,因此我创建了CancellationTokenSource并在客户端上进行了以下更改:

var response = client.PostAsJsonAsync(url, dto, cts.Token).Result;

动作的更改:

public IHttpActionResult MyAction(SearchDto dto, CancellationToken ct)
{
    HostingEnvironment.QueueBackgroundWorkItem(async ct =>
    {
        //Do background work
        var result = await myService.DoWorkAsync(dto, ct);
    });

    return Ok();
}

我的问题是这行:

  

HostingEnvironment.QueueBackgroundWorkItem(async ct =>

如果需要使用传递给操作的ct,我将如何使用IIS需要传递给后台线程的ct

1 个答案:

答案 0 :(得分:1)

您需要做的是将您获得的两个取消令牌组合在一起,第一个来自客户端,第二个来自HostingEnvironment。您可以使用此CancellationTokenSource.CreateLinkedTokenSource方法

public IHttpActionResult MyAction(SearchDto dto, CancellationToken ct1)
{
    HostingEnvironment.QueueBackgroundWorkItem(async ct2 =>
    {
        using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
        {
            var result = await myService.DoWorkAsync(dto, linkedCts.Token);
        }
    });

    return Ok();
}