Подтвердить что ты не робот

Получите ответ от PostAsJsonAsync

У меня есть эта строка кода

var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;

Вызываемый контроллер WebAPI возвращает bool, чтобы убедиться, что объект был сохранен, но как вернуть этот ответ bool?

4b9b3361

Ответ 1

Продолжайте получать содержимое:

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, чтобы определить, что сохранение успешно.

Ответ 2

Принятый ответ технически корректен, но блокирует текущий поток при вызовах .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.

Ответ 3

Поскольку его асинхронная операция не выполняется немедленно. Вызывает ошибку как

Вместо этого вам нужно сделать это 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;
}

ПРИМЕЧАНИЕ. Я только что написал их здесь, поэтому я действительно не тестировал их, но более или менее того, что вам нужно.

Надеюсь, это поможет!

Ответ 4

Если вы вызываете общую версию, она должна вернуть вам bool:

var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;

По крайней мере, согласно документам.

Ответ 5

Я использовал 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
            }