2015-07-17 5 views
2

Я загружаю изображение с HttpClient.PostAsync() на моем приложении Windows Phone 8. Пользователь имеет возможность отменить эту загрузку с помощью кнопки пользовательского интерфейса.Отмена запроса POST «HttpClient»

Чтобы отменить запрос 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 МБ (не так уж и много).

Итак, есть способ отменить запрос POST HttpClient?

+0

От [этот ответ] (http://stackoverflow.com/a/29587505/1497596): * «Нет гарантии, что отмена« CancelationTokenSource »отменяет базовую операцию. Это зависит от реализации базовой операции (в данном случае метода« SendAsync »). Операция может быть отменена немедленно или через несколько секунд или никогда ». * Итак, на основании этого, похоже, что после выполнения запроса' PostAsync() 'вам может потребоваться проверить' cancelationToke n.IsCancellationRequested', и если true, вызовите 'DeleteAsync()' для загруженного изображения. – DavidRR

+0

Хотя вы указали [windows-phone-8] (http://stackoverflow.com/tags/windows-phone-8/info), вы * не указали, используете ли вы [Windows.Web.Http.HttpClient ] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.web.http.httpclient.aspx) или [System.Net.Http.HttpClient] (https://msdn.microsoft .com/EN-US/библиотека/system.net.http.httpclient% 28В = vs.118% 29.aspx). (Исходя из параметров, предоставленных вашему вызову 'PostAsync()', он * появляется * как последний.) – DavidRR

+0

Связанный: [Правильно отменять или отменить PostAsync] (http://stackoverflow.com/q/23920754/1497596) – DavidRR

ответ

0

Отмена задачи не прерывает ее мгновенно. Вы должны вручную проверить, прежде чем делать свою работу, проверяя статус лексемы:

if (ct.IsCancellationRequested) 
{ 
    ct.ThrowIfCancellationRequested(); 
} 

// Post request here... 

Эта статья является весьма полезным: How to: Cancel a Task and Its Children

+1

Я делаю это. Моя проблема в том, что я хочу отменить загрузку, которая уже началась (я вижу, что трафик загрузки в моем прокси). хотя мое приложение останавливает работу, а также точка останова на ответе httpclient не срабатывает ... изображение загружается – Joehl

0
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 
    } 
+0

Можете ли вы объяснить, почему это прервало бы базовую операцию? –

Смежные вопросы