Я хотел бы вернуть объект данных, содержащий сведения об ошибке, с помощью объекта 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.NET Web API версии 5.2.4, ориентированной на .NET Framework версии 4.6.1.
@AndreiDragotonu Спасибо. Это одна из вещей, которые я уже обдумываю, если нет способа, встроенного в .NET framework.





Вы можете построить/отформатировать строку в формате JSON, передать ее как строку в параметре BadRequest() и снова преобразовать ее в JSON или любой объект на бэкэнде вызывающей стороны.
Не пробовал, но должно сработать.
Для этого можно использовать метод 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);
}
Вау! только что попробовал это в примере проекта, и он работает. Почему я не посмотрел? Большое спасибо.
Не беспокойтесь, я только что нашел его сам, потому что у меня была похожая проблема! Я пытался делать всевозможные запутанные вещи, прежде чем наткнулся на этот метод.
возьмите свой пользовательский объект, сериализуйте его и используйте вторую перегрузку, чтобы вернуть его.