Я пишу приложение ASP.NET Core 2.2.0, размещенное в Service Fabric.
У меня есть класс, представляющий запрос, и я объявил два конструктора: открытый для моего собственного использования и закрытый для сериализаторов:
public class MyClass
{
private MyClass() // for serializer
{
}
public MyClass(string myProperty) // for myself
{
MyProperty = myProperty ?? throw new ArgumentNullException(nameof(myProperty));
}
[Required]
public string MyProperty { get; private set; }
}
Затем я создал контроллер API:
[ApiController]
public class MyController
{
[HttpPut]
public async Task<IActionResult> Save([FromBody] MyClass model)
{
throw new NotImplementedException("Doesn't matter in this example");
}
}
И я проверил его, вызвав значение null
с помощью Fiddler:
PUT /MyController (Content-Type: application/json)
{
"MyProperty": null
}
Проблема , с которой я сталкиваюсь, заключается в том, что мой публичный конструктор вызывается с myProperty, равным null
, что вызывает выброс ArgumentNullException
и приводит к 500 Internal Server Error.
Я ожидал , что он будет использовать закрытый конструктор без параметров и частные установщики.Затем, поскольку контроллер помечен атрибутом ApiController
, эта модель будет автоматически проверена по аннотациям данных и приведет к 400 ошибочным запросам, поскольку требуется MyProperty
.
Что интересно - если я сделаю конструктор по умолчанию общедоступным, то он будет работать, как и ожидалось, но я бы не хотел этого делать.
Почему он не использует приватный конструктор и как я могу сделать так, чтобы он использовал его, не помечая его как публичный?
Другой вопрос: понимает ли связыватель модели, как использовать конструктор с параметрами, использующими отражение?