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

Nic*_*ick 4 asp.net asp.net-web-api owin cancellation-token

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

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

    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

客户端有以下代码来调用我的 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.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果客户端的请求在调用“LongRunningNetworkOperation2”之前超时,则取消令牌会阻止“LongRunningNetworkOperation2”运行吗?换句话说,客户端可以通知 web api 停止运行某个请求吗?

Ste*_*ary 5

客户端可以向 Web api 发出信号以停止运行某个请求吗?

理论上,是的。取消HttpClient应关闭底层 TCP/IP 连接。作为响应,ASP.NET 堆栈应检测其客户端的丢失,并取消 WebAPI CancellationToken

在实践中,这取决于如何完成HttpClientWebAPI实现是你正在使用。不一定保证取消,但我希望它至少适用于桌面HttpClient