Возвратите объект данных с BadRequestResult / BadRequestErrorMessageResult - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел бы вернуть объект данных, который содержит подробную информацию об ошибке, с объектом BadRequestErrorMessageResult или BadRequestErrorMessageResult, например:

public IHttpActionResult Action(Model model)
{
  var validationResult = model.Validate();
  if (validationResult.Successful)
  {
    // this one's okay; it supports sending data with a 200
    return Ok(validationResult);
  }
  else
  {
    // However, how do I return a custom data object here
    // like so?
    // No such overload, I wish there was

    // return BadRequest(validationResult);
  }
}

Только три перегрузки ApiController.BadRequest()Метод:

1. BadRequest();
2. BadRequest(string message);
3. BadRequest(ModelStateDictionary modelState);

Даже с # 3, словарь состояния модели - это предельная глубокая коллекция с одним слоем на другом, в нижней части которого, однако, находится группа KeyValuePair<string, ModelError>, где каждый ModelError также имеет только string или Exception объект.

Поэтому даже с # 3 мы можем упаковать только string для отправки, а не пользовательский объект, как я хочук.

Я действительно не спрашиваю, как я могу сделать хак или клудж в этой ситуации.У меня такой вопрос: есть ли перегрузка или другой способ, запеченный в .NET API для отправки объекта клиенту с Плохой запрос HTTP-код состояния?

Я использую ASP.NETWeb API версии 5.2.4 для .NET Framework версии 4.6.1.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы можете использовать метод Content<T>(...), чтобы сделать это.Он возвращает NegotiatedContentResult, который сериализуется в зависимости от заголовков запроса (например, json, xml), и позволяет указать HttpStatusCode.

. Вы можете использовать его следующим образом:

return Content(HttpStatusCode.BadRequest, myObject);

Если вы хотите, вы можете создать свой собственный метод BadRequest<T>(T obj) в контроллере в качестве оболочки, чтобы затем вы могли вызывать его так, как вам нужно:

public IHttpActionResult BadRequest<T>(T obj)
{
    return Content(HttpStatusCode.BadRequest, obj);
}

public IHttpActionResult Action()
{
    // do whatever validation here.
    var validationResult = Validate();

    // then return a bad request
    return BadRequest(validationResult);
}
0 голосов
/ 19 февраля 2019

Вы можете построить / отформатировать строку в формате JSON, передать ее в виде строки в параметре BadRequest () и снова преобразовать ее в JSON или любой объект в бэкэнде вызывающего.

Не пробовал, но это должно сработать.

...