У меня есть проект веб-API ASP.NET Core, нацеленный на .NET Core 3.0 со следующим контроллером:
public class FooController : ControllerBase
{
[HttpPost]
public ActionResult Post(Foo foo) => Ok()
}
Foo
определен в отдельной библиотеке как:
public struct Foo
{
public int Bar { get; }
public Foo(int bar) => Bar = bar;
}
Я вызываю API из консольного приложения с помощью:
new HttpClient().PostAsJsonAsync("http://localhost:55555/api/foo", new Foo(1)).Wait();
Когда вводится метод контроллера, foo.Bar
имеет значение по умолчанию 0. Я ожидаю, что оно будет равно 1.
Раньше все работало как положено в .NET Core 2.2. Десериализатор JSON обрабатывает свойства с частными установщиками в структурах через перегруженный конструктор с именами параметров, совпадающими с именами свойств (без учета регистра).
Это больше не работает в .NET Core 3.0 с базовыми структурами ( EDIT: из-за это как , на которое указал Мартин Уллрих ). Однако, если я использую стандартный тип структуры, такой как DateTime
, он работает нормально. Есть ли что-то еще, что я должен теперь сделать с моей структурой, которую, например, DateTime
уже поддерживает? Я уже пытался реализовать ISerializable
на Foo
с кодом ниже, но это не сработало.
public Foo(SerializationInfo info, StreamingContext context)
{
Bar = (int)info.GetValue("bar", typeof(int));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("bar", Bar, typeof(int));
}
Любая помощь будет принята с благодарностью.