DeleteAsync и PostAsync не работают

1

Я написал этот рабочий PutAsync, который позволяет мне обновлять элементы в моей базе данных:

private async void Edit()
{
    using (HttpClient client = new HttpClient())
    {
        Item i = new Item();
        i.ID = SelectedItem.ID;
        i.Name = SelectedItem.Name;
        i.Cost = SelectedItem.Cost;

        string json = JsonConvert.SerializeObject(i);

        HttpResponseMessage response = await client.PutAsync("http://localhost:5065/api/item", new StringContent(json, Encoding.UTF8, "application/json"));
        if (response.IsSuccessStatusCode)
        {
            string jsonresponse = await response.Content.ReadAsStringAsync();
            int result = JsonConvert.DeserializeObject<int>(jsonresponse);
            if (result == 2)
            {
                GetItems();
            }
        }
    }
}

Теперь я хотел удалить элементы и добавлять новые элементы, но этот код не работает:

public ICommand DeleteCommand
{
    get { return new RelayCommand(Delete); }
}

private async void Delete()
{
    using (HttpClient client = new HttpClient())
    {
        Item i = new Item();
        i.ID = SelectedItem.ID;
        i.Name = SelectedItem.Name;
        i.Cost = SelectedItem.Cost;

        HttpResponseMessage response = await client.DeleteAsync("http://localhost:5065/api/item/" + i.ID );
        if (response.IsSuccessStatusCode)
        {
            string jsonresponse = await response.Content.ReadAsStringAsync();
            int result = JsonConvert.DeserializeObject<int>(jsonresponse);
            if (result == 2)
            {
                GetItems();
            }
        }
    }
}

И то же самое касается моего PostAsync:

private async void New()
{
    using (HttpClient client = new HttpClient())
    {     
        Item i = new Item();
        i.Name = SelectedItem.Name;
        i.Cost = SelectedItem.Cost;

        string json = JsonConvert.SerializeObject(i);

        HttpResponseMessage response = await client.PostAsync("http://localhost:5065/api/item", new StringContent(json, Encoding.UTF8, "application/json"));
        if (response.IsSuccessStatusCode)
        {
            string jsonresponse = await response.Content.ReadAsStringAsync();
            int result = JsonConvert.DeserializeObject<int>(jsonresponse);
            if (result == 2)
            {
                GetItems();
            }
        }
    }
}

Я получаю следующий ответ:

{StatusCode: 204, ReasonPhrase: 'No Content', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:{  Pragma: no-cache  X-SourceFiles: =?UTF-8?B?RDpcU0NIT09MXE5NQ1QgTGFhdHN0ZVxCdXNpbmVzcyBhcHBsaWNhdGlvbnNcUFJPSkVDVFxQcm9qZWN0XFByb2plY3QuYXBpXGFwaVxwcm9kdWN0XDU=?=  Cache-Control: no-cache  Date: Mon, 19 Jan 2015 13:48:32 GMT  Server: Microsoft-IIS/8.0  X-AspNet-Version: 4.0.30319  X-Powered-By: ASP.NET  Expires: -1}}

Что я сделал не так, и как я могу сделать как мой пост, так и удалить работу?

EDIT: Здесь некоторый серверный код Delete void, это довольно Basic:

public static int DeleteItem(int id)
        {
            int rowsaffected = 0;
            DbTransaction trans = null;

            try
            {
                trans = Database.BeginTransaction("ConnectionString");

                string sql = "DELETE FROM Item WHERE ID=@ID";
                DbParameter par1 = Database.AddParameter("ConnectionString", "@ID", id);
                rowsaffected += Database.ModifyData(trans, sql, par1);

                trans.Commit();
            }
            catch (Exception ex)
            {
                if (trans != null)
                    trans.Rollback();
            }
            finally
            {
                if (trans != null)
                    Database.ReleaseConnection(trans.Connection);
            }

            return rowsaffected;
        }

Я называю это здесь:

   // DELETE: api/Item/5
        public void Delete(int id)
        {
            ItemDataAccess.DeleteItem(id);
        }

EDIT: Возможно, дополнительная информация по следующей строке

int result = JsonConvert.DeserializeObject<int>(jsonresponse);

Я получаю эту ошибку в обоих случаях:

A first chance exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

Additional information: No JSON content found and type 'System.Int32' is not nullable. Path '', line 0, position 0.
  • 1
    Вам нужно показать, как эти методы вызываются. Методы async void следует использовать только в очень специфических обстоятельствах (например, обработчики событий).
  • 1
    Если вы отправляете удаление на ваш сервер через PostMan или другой клиент REST, это работает? Другими словами, вы уверены, что ваш сервер обрабатывает запрос правильно?
Показать ещё 3 комментария
Теги:
async-await
mvvm
mvvm-light

1 ответ

1

Ваши звонки успешны, 204 - код успеха, который говорит клиенту, что он не ожидает каких-либо данных в теле. Вы ничего не возвращаете из своих сообщений, поэтому сервер автоматически заполняет 204 для типа void в методе контроллера.

  • 0
    Я не знаю, так ли это, я пытался установить его как public int Delete(int id) { return ItemDataAccess.DeleteItem(id); } И это все еще ничего не меняет в моей базе данных, но я все равно получаю ответ 204 No Content
  • 0
    Если вы хотите вернуть значение, проверьте этот вопрос, который может оказаться дубликатом: stackoverflow.com/questions/13370196/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню