2015-11-10 3 views
1

У меня есть следующая часть кода:Не получив ответа после PostAsync

using (var client = new HttpClient()) // from Windows.Web.Http; 
{ 
    //setup client 
    var tokenUri = new Uri(apiBaseUri + "/token"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(
         new HttpMediaTypeWithQualityHeaderValue("application/json")); 

    //setup login data 
    IHttpContent formContent = new HttpFormUrlEncodedContent(new[] 
    { 
     new KeyValuePair<string, string>("grant_type", "password"), 
     new KeyValuePair<string, string>("username", userName), 
     new KeyValuePair<string, string>("password", password), 
    }); 

    //send request 
    HttpResponseMessage responseMessage = await client.PostAsync(tokenUri, formContent); 

    //get access token from response body 
    var responseJson = await responseMessage.Content.ReadAsStringAsync(); 
    var jObject = JObject.Parse(responseJson); 
    return jObject.GetValue("access_token").ToString(); 
} 

Это делает вызов на мой веб-Апи. Я проверил, действительно ли он работает с скрипачом - в результате я могу видеть ответ, который я вижу (маркер Bearer). Но в коде этот ответ так и не был получен.

В чем проблема?

+0

Что вы имеете в виду, responseMessage является нулевым? –

+0

@AndyWiesendanger, ничего ... Может быть, я должен установить некоторый тайм-аут, чтобы быть уверенным, но я жду много времени и ничего не происходит – demo

+1

Как вы называете этот метод? Вы блокируете его с помощью 'Task.Result'? –

ответ

2

Это:

var token = GetAPIToken(UserName, Password, ApiBaseUri).Result; 

Вызывает классический тупик. You shouldn't be blocking on async code с Task.Result или Task.Wait. Вместо этого вам нужно идти «асинхронной весь путь» и ждут от него тоже, что делает метод выше в стеке вызовов async Task as well:

public async Task GetApiTokenAsync() 
{ 
    var token = await GetAPIToken(UserName, Password, ApiBaseUri); 
} 
Смежные вопросы