HttpClient PutAsyn c не обновляет веб-API - PullRequest
0 голосов
/ 01 марта 2020

У меня есть простой. 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);
        }

    }
...