取消’HttpClient’POST请求

我在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); } 

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

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

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

 if (ct.IsCancellationRequested) { ct.ThrowIfCancellationRequested(); } // Post request here... 

这篇文章非常有用: 如何:取消任务及其子项

  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 }