public class MyModel
{
[JsonProperty(PropertyName = "foo", Required = Required.Always)]
public String Bar;
}
public class MyController : ApiController
{
public String PostVersion1([FromBody] MyModel myModel)
{
if (ModelState.IsValid)
{
if (myModel.Bar == null)
return "What?!";
else
return "Input is valid.";
}
else
{
return "Input is invalid.";
}
}
}
Результаты:Как получить WebAPI для проверки моего JSON с помощью JsonProperty (обязательно = Required.Always)?
Input |Output
-------------------|------
{ "bad" : "test" } | What?!
{ "Bar" : "test" } | What?!
{ "foo" : "test" } | Input is valid.
JsonPropertyAttribute явно поддерживаются, потому что я в состоянии установить ИмениСвойства и он вступит в силу. Однако я ожидал бы, что ModelState.IsValid
будет ложным для первых двух примерных входов, потому что параметр Required
JsonProprty был установлен на Always.
Если я просто запустить его через JsonConvert:
JsonConvert.DeserializeObject<MyModel>(@"{'bad':'test'}");
исключение выбрасывается во время десериализации, как и ожидалось:
Result Message: Newtonsoft.Json.JsonSerializationException : Required property 'foo' not found in JSON. Path '', line 1, position 14.
В сборках выпусков представляется, что исключение проглатывается, и общее исключение отправляется обратно пользователю. Исследования необходимы, чтобы отправить обратно полезные ошибки. –
Решено, что ошибка отправляется с фильтром исключений, который создает специальный ответ (400), когда видит исключение JsonSerializationException. –
Почему вы используете Task.Factory.StartNew() ?? Просто используйте Task.FromResult (...). Плохая практика использования Task.Factory.StarNew() для операций с привязкой к ЦП. –