取消 'HttpClient' POST 请求

Posted

技术标签:

【中文标题】取消 \'HttpClient\' POST 请求【英文标题】:Cancel an 'HttpClient' POST request取消 'HttpClient' POST 请求 【发布时间】:2015-07-17 08:20:38 【问题描述】:

我正在我的 Windows Phone 8 应用上上传带有HttpClient.PostAsync() 的图像。用户可以选择通过 UI 按钮取消此上传。

为了取消 POST 请求,我设置了 CancellationToken。但这不起作用。在取消请求之后,我仍然看到在我的代理中进行上传,很明显请求被忽略了。我的代码:

using (var content = new MultipartFormDataContent())

    var file = new StreamContent(stream);
    file .Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    
        FileName =  "filename.jpg",
    ;
    file.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
    content.Add(file);

    await httpclient.PostAsync(new Uri("myurl", UriKind.Absolute), content,
        cancellationToken);

还请注意,我有一个CancellationTokenSource 用于CancellationToken。用户单击取消按钮后,将调用tokensource.Cancel()。另外,我的测试用例中的图像是 1 到 2 MB(不是那么大)。

那么,有没有办法取消HttpClient POST 请求?

【问题讨论】:

From this answer: "不保证取消CancelationTokenSource会取消底层操作。这取决于底层操作的实现(在这种情况下SendAsync方法). 操作可以立即取消,也可以在几秒钟后取消,或者永远不会取消。” 因此,基于此,在发出PostAsync() 请求后,您可能需要检查cancellationToken.IsCancellationRequested,如果为真,在上传的图片上调用DeleteAsync() 虽然您指定了windows-phone-8,但您没有指定您使用的是Windows.Web.Http.HttpClient 还是System.Net.Http.HttpClient。 (根据提供给您的 PostAsync() 调用的参数,它似乎是后者。) 相关:Properly Abort or Cancel PostAsync 【参考方案1】:
   try
   
          var client = new HttpClient();

          var cts = new CancellationTokenSource();
          cts.CancelAfter(3000); // 3seconds

          var request = new HttpRequestMessage();

          await client.PostAsync(url, content, cts.Token);

  
  catch(OperationCanceledException ex)
  
          // timeout has been hit
  

【讨论】:

你能解释一下为什么这会中止底层操作吗?【参考方案2】:

取消任务不会立即终止它。在进行工作之前,您必须通过检查令牌的状态进行手动检查:

if (ct.IsCancellationRequested) 

    ct.ThrowIfCancellationRequested();


// Post request here...

这篇文章很有用:How to: Cancel a Task and Its Children

【讨论】:

我这样做。我的问题是,我想取消已经开始的上传(我在代理中看到上传流量)。虽然我的应用程序停止了工作,并且 httpclient 响应上的断点也没有触发...图像已上传

以上是关于取消 'HttpClient' POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何通过python twisted HTTPClient生成POST和GET请求?

java实现发送post请求

取消 HttpClient 请求 - 为啥 TaskCanceledException.CancellationToken.IsCancellationRequested 为假?

HttpClient获取请求取消,以防操作时间超过x分钟

httpclient 中post请求重定向

Xamarin HttpClient:TaskCancelledException