У меня есть следующий запрос:
Как вы можете видеть, это недействительно JSON. Даже это не JSON. Это просто случайный набор букв. Я хотел бы проверить, что клиент не может передать тело, как на экране раньше, в моем веб-API. Если это произойдет, я хотел бы отправить что-то вроде:
{
"status": "error",
"description": "Invalid JSON"
}
Итак, у меня есть следующий фильтр:
public class MyValidateJson : ActionFilterAttribute
{
public override async void OnActionExecuting(ActionExecutingContext context)
{
// check if json is valid
using StreamReader reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8);
var body = await reader.ReadToEndAsync();
try
{
JToken.Parse(body);
}
catch (JsonReaderException ex)
{
context.Result = new BadRequestObjectResult(new
{
status = "error",
description = "Invalid JSON input"
});
base.OnActionExecuting(context);
}
Но я не могу прочитать тело. У меня всегда есть пустая строка. И в результате у меня всегда неверный JSON. Как я могу улучшить свой фильтр?
Обновление
Может быть, мое объяснение проблемы не ясно, я постараюсь это исправить. Итак, я хотел бы избежать этой ситуации:
Как вы можете видеть {"":["Error parsing boolean value. Path '', line 1, position 1."]}
- это ... что это для моего клиента? Для клиента это должно быть что-то вроде:
{
"status": "error",
"description": "Your JSON is invalid, we are sorry ((("
}
, но не {"":["Error parsing boolean value. Path '', line 1, position 1."]}
У меня есть следующий контроллер:
[Route("/api/v1.0/startup")]
[HttpPost]
public async Task<IActionResult> Update([FromBody] CustomerChangeViewModel viewModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
...
И просмотр модели тоже:
public class CustomerChangeViewModel
{
[JsonProperty("idfa")]
[Required(ErrorMessage = "Required idfa")]
public string Idfa { get; set; }
[JsonProperty("idfv")]
[Required(ErrorMessage = "Required idfv")]
public string Idfv { get; set; }
[Required(ErrorMessage = "Required app_build_number")]
[JsonProperty("app_build_number")]
public string AppBuildNumber { get; set; }
[JsonProperty("app_version")]
[Required(ErrorMessage = "Required app_version")]
public string AppVersion { get; set; }
...
Как я могу получить это поведение? Я имею в виду с хорошим ответом (не текст исключения).