Отменить вызов aC# httpClient GetStreamAsync

Мне нужно добавить возможность отмены http-запроса в старом проекте C#.

В проекте используется HttpClient::GetStreamAsync, который, похоже, не поддерживает токены отмены.

Можно ли отменить вызов GetStreamAsync? Какие еще возможности у меня есть?

3 ответа

Решение

Из-за того, как работает поток, его нельзя отменить. Я обнаружил альтернативное решение в сообщении в блоге MSDN, написанном в 2012 году. Возможно, оно вам поможет. Автор использует GetStringAsync но принцип также относится к GetStreamAsync, Статья: Ждите HttpClient.GetStringAsync() и отмены.

В статье MSDN автор использует GetAsync(...) который может принимать параметр отмены. Простое решение проблемы Натана может быть примерно таким...

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();
    }
}

То же, что и ответ Джонса, только как метод расширения:

       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();
        }
    }
Другие вопросы по тегам