Я написал этот рабочий 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.
Ваши звонки успешны, 204 - код успеха, который говорит клиенту, что он не ожидает каких-либо данных в теле. Вы ничего не возвращаете из своих сообщений, поэтому сервер автоматически заполняет 204 для типа void
в методе контроллера.
public int Delete(int id) { return ItemDataAccess.DeleteItem(id); }
И это все еще ничего не меняет в моей базе данных, но я все равно получаю ответ 204 No Content
async void
следует использовать только в очень специфических обстоятельствах (например, обработчики событий).PostMan
или другой клиент REST, это работает? Другими словами, вы уверены, что ваш сервер обрабатывает запрос правильно?