RestSharp асинхронный PUT

Есть одно приложение, API с доступом к базе данных и одно приложение, которое вызывает API с помощью RestSharp. Я реализовал все асинхронные методы RestSharp для универсальной работы. Итак, GET, POST, DELETE все работает. Единственное, что я не могу заставить работать, это PUT.

Прежде всего, это мои контроллеры PUT:

[HttpPut("{id}")]
public void Put(int id, [FromBody]ApplicationUser value)
{
    string p = value.Email;
}

это мой метод:

 public Task<bool> PutRequestContentAsync<T>(string resource, object id, T resourceObject) where T : new()
    {
        RestClient client = new RestClient("http://localhost:54008/api/");
        RestRequest request = new RestRequest($"{resource}/{{id}}", Method.PUT);
        request.AddUrlSegment("id", id);
        request.AddObject(resourceObject);
        var tcs = new TaskCompletionSource<bool>();

        var asyncHandler = client.ExecuteAsync<T>(request, r =>
        {
            tcs.SetResult(r.ResponseStatus == ResponseStatus.Completed);
        });

        return tcs.Task;
    }

и это мой вызов в представлении (все остальные вызовы GET,... работают нормально):

bool putOk = await new RepositoryCall()
    .PutRequestContentAsync("Values", 2, 
        new ApplicationUser { 
            Email="[email protected]" 
        }
    );

при отладке статус ответа равен Completed, но PUT никогда не вызывается.

Есть идеи, в чем может быть проблема?


person Matthias Burger    schedule 04.08.2016    source источник
comment
Вы имеете в виду PUT, но ваш вызов репозитория отражает DELETE. Вероятно, вы скопировали неверный фрагмент кода.   -  person serhiyb    schedule 04.08.2016
comment
@serhiyb да, я опубликовал неправильный метод. обновлено: Д   -  person Matthias Burger    schedule 04.08.2016
comment
На каком веб-сервере вы его тестировали? IIS/IIS Express?   -  person serhiyb    schedule 04.08.2016
comment
приложение пока работает непосредственно с Visual Studio 2015, поэтому IIS Express   -  person Matthias Burger    schedule 04.08.2016
comment
Можете ли вы попробовать этот ответ: stackoverflow.com/a/24791070/5103294 (в конфигурации вашего сервера тот, который обрабатывать запрос PUT, а не отправителя)   -  person serhiyb    schedule 04.08.2016
comment
конечно, я попробую   -  person Matthias Burger    schedule 04.08.2016
comment
@serhiyb, если вам интересно, я отправил ответ. проблема была в коде, а не в конфиге. но спасибо за помощь!   -  person Matthias Burger    schedule 04.08.2016
comment
Круто, спасибо за ваш ответ.   -  person serhiyb    schedule 04.08.2016


Ответы (1)


Итак, наконец, я сам получил свой ответ... (сидел вчера 6 часов и безрезультатно, сегодня еще час и все работает)

public Task<bool> PutRequestContentAsync<T>(string resource, object id, T resourceObject) where T : new()
{
    RestClient client = new RestClient("http://localhost:54008/api/");
    RestRequest request = new RestRequest($"{resource}/{{id}}", Method.PUT);
    request.AddUrlSegment("id", id);

    request.RequestFormat = DataFormat.Json;
    request.AddBody(resourceObject);

    var tcs = new TaskCompletionSource<bool>();

    var asyncHandler = client.ExecuteAsync<T>(request, (response) => {
        tcs.SetResult(response.ResponseStatus == ResponseStatus.Completed);
    });
    return tcs.Task;
}

хитрость заключалась в том, чтобы добавить RequestFormat и изменить AddObject на AddBody :)

person Matthias Burger    schedule 04.08.2016
comment
У меня похожая проблема, но мой контроллер возвращает IActionResult, поэтому я поставил Task‹IActionResult›. но не могу понять, как заставить метод ждать завершения задачи, прежде чем возвращать View. - person Ricker Silva; 01.08.2017
comment
@RickerSilva Я думаю, твоя проблема в том, как использовать async/await? Если да, я думаю, вам нужно начать с другого вопроса. - person Matthias Burger; 02.08.2017