我需要在一个旧的C#项目中添加取消HTTP请求的可能性。
该项目使用HttpClient::GetStreamAsync,似乎不支持Cancellation tokens。
GetStreamAsync调用可以取消吗? 我还有什么其他选择?
我需要在一个旧的C#项目中添加取消HTTP请求的可能性。
该项目使用HttpClient::GetStreamAsync,似乎不支持Cancellation tokens。
GetStreamAsync调用可以取消吗? 我还有什么其他选择?
原始回答: 我在2012年的一个MSDN博客文章中发现了一种替代方案。这可能对你有所帮助。作者使用了 GetStringAsync
,但是原理也适用于 GetStreamAsync
。文章链接: Await HttpClient.GetStringAsync() and cancellation.
在该MSDN文章中,作者使用了 GetAsync(...)
,可以接受取消参数。Nathan的问题的一个简单解决方案可能是这样的...
CancellationTokenSource cancellationSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationSource.Token;
Uri uri = new Uri("some valid web address");
HttpClient client = new HttpClient();
await client.GetAsync(uri, cancellationToken);
// In another thread, you can request a cancellation.
cancellationSource.Cancel();
CancellationTokenSource
对象上进行的,而不是 CancellationToken
对象。这是一个简单的例子。
public async Task<Stream> GetWebData(string url, CancellationToken? c = null)
{
using (var httpClient = new HttpClient())
{
var t = httpClient.GetAsync(new Uri(url), c ?? CancellationToken.None);
var r = await t;
return await r.Content.ReadAsStreamAsync();
}
}
和John的答案一样,只是作为扩展方法:
internal static class HttpClientExtensions
{
public async static Task<Stream> GetStreamAsync(this HttpClient httpClient, string url, CancellationToken ct)
{
var response = await httpClient.GetAsync(new Uri(url), ct);
return await response.Content.ReadAsStreamAsync();
}
}