У меня есть эта строка кода
var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
Вызываемый контроллер WebAPI возвращает bool, чтобы убедиться, что объект был сохранен, но как вернуть этот ответ bool?
У меня есть эта строка кода
var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
Вызываемый контроллер WebAPI возвращает bool, чтобы убедиться, что объект был сохранен, но как вернуть этот ответ bool?
Продолжайте получать содержимое:
var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;
Но это действительно наивный подход для быстрого получения результата. PostAsJsonAsync
и ReadAsAsync
не предназначены для этого, они предназначены для поддержки программирования async await
, поэтому ваш код должен быть:
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Кроме того, вместо использования флага для проверки того, сохраняется или нет объект, вы должны использовать коды HTTP, возвращая 200 OK
, чтобы определить, что сохранение успешно.
Принятый ответ технически корректен, но блокирует текущий поток при вызовах .Result
. Если вы используете .NET 4.5 или выше, вам следует избегать этого почти во всех ситуациях. Вместо этого используйте эквивалентную асинхронную (неблокирующую) версию:
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Обратите внимание, что метод, содержащий вышеуказанный код, должен быть помечен async
и должен быть await
ed.
Поскольку его асинхронная операция не выполняется немедленно. Вызывает ошибку как
Вместо этого вам нужно сделать это async, выполнив следующее:
using (var httpClient = new HttpClient())
{
var task = httpClient.PostAsJsonAsync(posturi, model)
.ContinueWith( x => x.Result.Content.ReadAsAsync<bool>().Result);
// 1. GETTING RESPONSE - NOT ASYNC WAY
task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE!
bool response = task.Result
// 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5
task.ContinueWith( x => {
bool response = x.Result
});
// 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5
bool response = await task;
}
ПРИМЕЧАНИЕ. Я только что написал их здесь, поэтому я действительно не тестировал их, но более или менее того, что вам нужно.
Надеюсь, это поможет!
Если вы вызываете общую версию, она должна вернуть вам bool:
var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;
По крайней мере, согласно документам.
Я использовал HttpStatusCode для проверки результата.
public HttpStatusCode PostStaffPositions(Foo foo)
{
string uri = myapiuri;
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(uri, foo).Result;
return response.StatusCode;
}
}
И затем в Controller проверьте его так:
HttpStatusCode update = staffrest.PostStaffPositions(foo);
if (update == HttpStatusCode.OK)
{
//Update Succeed
}
else
{
//Update Failed
}