2015-06-28 2 views
0

Я получаю две ошибки в следующем коде:Как правильно использовать HttpClient с async/wait?

public async Task<string> TestDownloadTask() 
{ 
    HttpResponseMessage response = null; 

    using (HttpClient client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(@"https://api.nasa.gov/planetary/apod"); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     response.EnsureSuccessStatusCode(); 
     response = await client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY"); 
    } 

    return response.Content; 
} 

Я получаю:

  • Не могу дождаться 'System.Threading.Tasks.Task' на "ждут" линии
  • Невозможно преобразовать тип выражения «System.Net.Http.Content» для возврата типа «строка»

Я пытаюсь написать код выше, который загрузит строку из веб-s ervice, но, похоже, существует много противоречивой информации о том, как использовать async и ждать и как использовать HttpClient, и я не знаю, что не так с кодом, который я написал.

Где я ошибаюсь и как я должен это делать?

+2

Вы абсолютно уверены, что это ошибка, которую вы получаете? 'GetStringAsync' возвращает' Task ', и вы пытаетесь присвоить результат переменной типа HttpResponseMessage, поэтому ваш код определенно сломан из-за несоответствия типов, но кажется маловероятным, что вы получите ошибку «Не могу ждать« System.Threading.Tasks.Task ». –

ответ

3

client.GetStringAsync Этот метод возвращает Task<string>

public Task<string> TestDownloadTask() 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(@"https://api.nasa.gov/planetary/apod"); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     // You don't need await here 
     return client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY"); 
    } 
} 

Для использования функции выше:

public async void SomeMethod() 
{ 
    // await to get string content 
    string mystring = await TestDownloadTask(); 
} 
+0

Я в замешательстве, HttpResponseMessage не нужен? – user9993

+0

Да. Вам не нужна HttpResponseMessage, возвращаемая строка GetStringAsync –

+1

@ user9993 'HttpResponseMessage' не является волшебным заклинанием. Если вы получаете «HttpResponseMessage» из любых методов, которые вы вызываете, и вам нужно сохранить их в переменной, вам нужна переменная «HttpResponseMessage». Иначе вам это не понадобится. –

1

Изменение либо к

return await client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY"); 

или к

return await response.Content.ReadAsStringAsync(); 
+0

В чем разница и когда следует использовать другую? – user9993

+0

'response.Content' имеет тип' HttpContent', который может представлять не только строку, но, например, массив байтов, если вы хотите загрузить файл. В вашем случае нет разницы. – nativehr

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