Это очень похоже, но мой вопрос другой: Возврат содержимого с помощью IHttpActionResult для ответа не в порядке
Учитывая, что вопрос другой, я прошу более краткий ответ, если он существует.
Моя архитектура следующая:
- вызов Javascript / jQuery для внутреннего контроллера
- Внутренний контроллер вызывает службу WebAPI
- Сервис WebAPI запрашивает БД (и т. Д.) И возвращает данные
У меня есть следующий упрощенный код (веб-API) ...
Пример 1: ошибка возврата, если идентификатор продукта не существует:
public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
Пример 2 возвращает пустые данные, если идентификатор продукта не существует:
public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
return Ok(product);
}
JS на стороне клиента:
$.getJSON("example.json", function() {
alert("success");
})
.done(function() { alert('Product retrieved'); })
.fail(function() { alert('Product doesn't exist. '); })
.always(function() { ... });
Я много раз читал, что использование исключений для управления потоком является плохой практикой, что, в сущности, произойдет, если я использую NotFound()
, поскольку он попадет в функцию .fail
, предполагая, что произошла ошибка (которая не было)
В другом случае, когда комментарий должен быть одобрен кем-то, кроме человека, вставившего комментарий:
public IHttpActionResult ApproveComment(int rowId, string userName)
{
try {
return Ok(BusinessLogicLayer.ApproveComment(rowId, userName));
}
catch(Exception ex)
{
// elmah.logerr...
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.InnerException == null ? ex.Message : ex.InnerException.Message));
}
}
BusinessLogicLayer:
public string ApproveComment(int rowId, string userName)
{
if (userName == _repository.GetInsertedCommentUserName()) {
return "You cannot approve your own comment.";
}
if(_repository.ApproveComment(rowId, userName)){
return "Comment approved";
}
}
ИЛИ
public string ApproveComment(int rowId, string userName)
{
if (userName == _repository.GetInsertedCommentUserName()) {
throw new Exception("You cannot approve your own comment.");
}
if(_repository.ApproveComment(rowId, userName)){
return "Comment approved";
}
}
Что такое чистый и элегантный способ вернуть соответствующее сообщение пользователю без использования исключений?
Или я ошибаюсь, это «исключительные» обстоятельства с точки зрения пользователей? IE. "Я ожидаю, что продукт будет возвращен, когда я передам этот идентификатор, но, увы, его не существует!" С точки зрения разработчиков / тестировщиков, я не думаю, что это был бы исключительный случай, но с точки зрения конечного пользователя - возможно.