客户端可以取消 Web Api 请求吗?

4

我在我的Web API控制器中有以下方法(长时间运行的方法会尊重取消令牌,即如果请求已被取消,它们不会运行):

public async Task<IHttpActionResult> ApiMethod(CancellationToken cancellationToken)
{
    await LongRunningNetworkOperation1(cancellationToken);
    await LongRunningNetworkOperation2(cancellationToken);

    return Ok();
}

客户端有以下代码来调用我的Web API控制器:
using (var httpClient = new HttpClient())
{
    httpClient.Timeout = TimeSpan.FromMilliseconds(3000);

    try
    {
        // Sending DELETE request
        HttpResponseMessage deleteMessage = await httpClient.
                             DeleteAsync("http://localhost:80/api/apiMethod");
    }
    catch (Exception e)
    {
        // Timeout occurred.
    }
}

如果客户端在“LongRunningNetworkOperation2”被调用之前超时,那么cancellationToken会阻止“LongRunningNetworkOperation2”运行吗?换句话说,客户端是否可以向Web API发出信号以停止运行某个请求?

1个回答

7
理论上是可以的。取消 HttpClient 会关闭底层的 TCP/IP 连接。ASP.NET 的堆栈应该检测到客户端的丢失,并取消 WebAPI 的 CancellationToken。但实际上,这取决于你所使用的 HttpClientWebAPI 实现的完整程度。不能保证一定可以取消,但至少在桌面版 HttpClient 上应该是可以工作的。

你知道有没有任何地方记录了这种特定的取消行为? - Nick
@Nick:asp.net网站上的搜索功能现在无法使用,所以我不确定它是否被正式记录在案。 - Stephen Cleary
1
本文介绍了在客户端是浏览器的情况下取消长时间运行查询的行为。链接地址为:https://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspx - Bondolin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接