取消 '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请求?
取消 HttpClient 请求 - 为啥 TaskCanceledException.CancellationToken.IsCancellationRequested 为假?