2017-01-30 3 views
0

У меня есть вызов API, который использует функцию .Result для синхронного действия.«.Result» не работает синхронно

HttpResponseMessage response = client.PostAsync("api/updatelastname", new StringContent(string.Format("UserId={0}&LastName={1}", userId, lastName), Encoding.UTF8, "application/x-www-form-urlencoded")).Result; 

Чтобы увидеть, если API был успешно завершен Я использую следующий if..then заявление, прежде чем продолжить.

if (!response.IsSuccessStatusCode) 
{ 
    // Something went wrong 
} 

В чем я смущен, иногда вызов api завершается без проблем, а иногда и нет. Кажется, что порой код не дожидается завершения вызова API, поэтому response.IsSuccessStatusCode - это false.

В идеале я думаю, что было бы лучше, чтобы сделать метод async и использовать await ключевое слово при вызове API, однако веб-приложение только цели .NET 4 в данный момент и async и await не не поддерживаются до .NET v4. 5.

Любые мысли о том, как я могу убедиться, что вызов API завершен до проверки response.IsSuccessStatusCode? Не перейдя в .NET v4.5 +?

ответ

1

Веб-приложение нацелено только на .NET 4 на данный момент, а async и ждут не поддерживаются до .NET v4.5.

Это клиент (один вызов PostAsync), а не веб-приложение, которое должно поддерживать await. Я предполагаю, что вы имеете в виду, что клиент - это веб-приложение.

иногда вызов api завершается без проблем, а иногда и нет.

Иногда это не завершено, вы имеете в виду? Как и в, код никогда не возвращается с Result?

Есть несколько сценариев, где Result будет тупиком, но я был бы удивлен, чтобы найти один на ASP.NET (к моему знанию, все Result тупиков с HttpClient только на некоторых мобильных платформах).

Кажется, что время от времени код не дожидается завершения вызова API и, следовательно, response.IsSuccessStatusCode является ложным.

То, что вы подозреваете, невозможно. Result будет блокироваться до завершения HTTP-запроса. Если IsSuccessStatusCode возвращает false, то это потому, что API возвратил код состояния без успеха.

+0

Спасибо, Стивен! Вы правы, клиент, вызывающий API, действительно является веб-приложением. Что я имел в виду под «не завершает», так это то, что 'IsSuccessStatusCode' иногда возвращает false, но когда я смотрю на вызов api, ничего не получается. – webworm

+0

@webworm: Если 'IsSuccessStatusCode' возвращает' false', то WebAPI действительно возвращает код ошибки. [Реализация этого свойства] (https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/HttpResponseMessage.cs#L123) тривиальна. –

+0

Спасибо за эту ссылку. Что-то еще должно продолжаться. Мне нужно выяснить, какой код состояния возвращается. Спасибо за помощь! Любите свою книгу «async». – webworm