У меня есть простой. Net Базовый веб-API с некоторыми простыми конечными точками Get, Post, Put. Я также создал простой консольный клиент для тестирования API. Методы get и post работают нормально, хотя, когда я тестирую Put, он не обновляет веб-API новыми данными. Я протестировал метод Put через веб-API с помощью swagger, и он работает нормально, поэтому кажется, что мой клиент Консольного приложения Logi c неверен. Кто-нибудь может увидеть, что я делаю не так?
edit: погода - это коллекция в памяти - список, поэтому мне не нужно SaveChanges ()
Консольный клиент:
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace Lab1RestConsole
{
class Program
{
private static readonly HttpClient client = new HttpClient();
private static readonly String baseURI = "https://localhost:44347/api/Weather/";
static async Task RunAsync()
{
try
{
//1 GET /api/Weather/
var serializer = new DataContractJsonSerializer(typeof(List<WeatherInformation>));
var streamTask = client.GetStreamAsync(baseURI);
var entries = serializer.ReadObject(await streamTask) as List<WeatherInformation>;
foreach (var e in entries)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("");
//2 GET /api/Weather/
serializer = new DataContractJsonSerializer(typeof(List<WeatherInformation>));
streamTask = client.GetStreamAsync(baseURI + "warning/false");
entries = serializer.ReadObject(await streamTask) as List<WeatherInformation>;
foreach (var e in entries)
{
Console.WriteLine(e.ToString());
}
//3 GET /api/Weather/city/Dublin
serializer = new DataContractJsonSerializer(typeof(WeatherInformation));
streamTask = client.GetStreamAsync(baseURI + "city/Dublin");
WeatherInformation weatherinfo = serializer.ReadObject(await streamTask) as WeatherInformation;
Console.WriteLine("\n" + weatherinfo + "\n");
// serialise to JSON
weatherinfo = new WeatherInformation() { City = "Antwerp", Temp = 3, Warning = true, WeatherType = 0, WindSpeed = 22 }; ;
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeatherInformation));
ser.WriteObject(ms, weatherinfo);
// read and create string content for POST
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
StringContent content = new StringContent(sr.ReadToEnd(), Encoding.UTF8, "application/json");
//4 POST - add new city
HttpResponseMessage httpResponse = await client.PostAsync(baseURI, content);
httpResponse.EnsureSuccessStatusCode();
//5 update PUT to api/Weather/Dublin - now temp is 10
weatherinfo = new WeatherInformation() { City = "Antwerp", Temp = 10, Warning = true, WeatherType = 0, WindSpeed = 22 }; ;
var putTask = client.PutAsync(baseURI + "Dublin", content);
}
catch (HttpRequestException e)
{
Console.WriteLine(e.Message);
}
}
static void Main()
{
RunAsync().Wait();
client.Dispose();
Console.ReadLine();
}
}
}
Действие Put в Web API
// PUT: api/Weather/5
[HttpPut("{city}")]
public IActionResult PutUpdateCityWeather(string city, WeatherInformation weatherInfo)
{
if (ModelState.IsValid)
{
var record = weather.FirstOrDefault(e => e.City.ToUpper() == city.ToUpper());
if (record != null)
{
record.Temp = weatherInfo.Temp;
record.Warning = weatherInfo.Warning;
record.WeatherType = weatherInfo.WeatherType;
record.WindSpeed = weatherInfo.WindSpeed;
return Ok();
}
else
{
return BadRequest();
}
}
else
{
return BadRequest(ModelState);
}
}