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 发出信号以停止运行某个请求吗?

4

1 回答 1

5

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

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

在实践中,这取决于您使用的HttpClient和实现的完整程度。WebAPI取消不一定能保证,但我希望它至少适用于桌面HttpClient

于 2016-04-13T01:38:30.383 回答