我正在编写一个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");
}
}
我通过在Fiddler中使用null
值进行调用来测试它:
PUT /MyController (Content-Type: application/json)
{
"MyProperty": null
}
我遇到的问题是,我的公共构造函数被调用时,我的属性myProperty等于Null,这会导致抛出ArgumentNullException并导致500的内部服务器错误。
我期望使用私有无参构造函数和私有setters。然后,由于控制器标记了ApiController属性,此模型将自动根据数据注释进行验证,并导致400 Bad Request,因为MyProperty是必需的。
有趣的是-如果我将默认构造函数设置为public,则它将按预期工作,但我不想这样做。
为什么它不使用私有构造函数,如何在不将其标记为public的情况下使用它?
另一个问题是,模型绑定器是否了解如何使用具有参数的构造函数来使用反射?