Подтвердить что ты не робот

Лучший API-интерфейс Web API для возврата HttpResponseMessage

У меня есть проект веб-API, и мои методы всегда возвращают HttpResponseMessage.

Итак, если он работает или не работает, я возвращаюсь:

Нет ошибок:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed.");

Любая ошибка или ошибка

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process.");

Когда я возвращаю объект, я использую:

return Request.CreateResponse(HttpStatusCode.OK, user);

Я хотел бы знать, как я могу вернуться к моему клиенту HTML5 с лучшей инкапсулированной задержкой, поэтому я могу вернуть дополнительную информацию о транзакции и т.д.

Я думал о создании пользовательского класса, который может инкапсулировать HttpResponseMessage, но также иметь больше данных.

Кто-нибудь реализовал нечто подобное?

4b9b3361

Ответ 1

Хотя это прямо не отвечает на вопрос, я хотел бы предоставить некоторую информацию, которую я нашел полезной. http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessage более или менее заменен на IHttpActionResult. Это намного проще в использовании.

public IHttpActionResult Get()
{
     Object obj = new Object();
     if (obj == null)
         return NotFound();
     return Ok(obj);
 }

Затем вы можете инкапсулировать, чтобы создавать собственные. Как настроить пользовательские заголовки при использовании IHttpActionResult?

Я еще не нашел необходимости в реализации пользовательского результата, но когда я это сделаю, я перейду по этому маршруту.

Скорее всего, это похоже на использование старого.

Дальнейшее расширение и предоставление дополнительной информации. Вы также можете включать сообщения с некоторыми из запросов. Например.

return BadRequest("Custom Message Here");

Вы не можете сделать это со многими другими, но помогаете распространять сообщения, которые хотите отправить назад.

Ответ 2

Вы можете вернуть ответ об ошибке, чтобы предоставить более подробную информацию.

public HttpResponseMessage Get()
{
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } };
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError);
 }

Вернется:

{ 
  "Message": "The file has no content or rows to process.", 
  "CustomErrorCode": 42 
}

Подробнее здесь: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

Я также использую http://en.wikipedia.org/wiki/List_of_HTTP_status_codes, чтобы помочь мне определить, какой код статуса http будет возвращен.

Ответ 3

Одно важное замечание: не помещайте контент в 204 ответа! Это не только противоречит спецификации HTTP, но и .NET может вести себя неожиданными манерами, если вы это сделаете.

Я ошибочно использовал return Request.CreateResponse(HttpStatusCode.NoContent, null);, и это привело к настоящей головной боли; будущие запросы из того же сеанса будут прерываться из-за наличия строкового значения "null", добавленного к ответу. Я полагаю, что .NET не всегда полностью очищает объект ответа от вызовов API от того же сеанса.