如何将CancellationToken传递给WebApi操作



我正在向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

您需要做的是组合您所拥有的两个取消令牌,第一个来自客户端,第二个来自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();
}

最新更新