Различные типы возвращаемых данных для веб-API ASP.NET

Я пытаюсь написать по-настоящему RESTful веб-службы через HTTP, используя веб-API ASP.NET MVC 4.

Текущая проблема, с которой я столкнулся, состоит в том, чтобы возвращать различные типы возвращаемых данных (сущность -тело )на основе моего кода состояния.

Например, для ресурса Hammer у меня есть класс модели.NET "Hammer" и HammerController:

namespace Awesomeness
{
    public class HammerController : ApiController
    {
        public Hammer Get(int id)
        {
        }
...

Если идентификатор не существует (404 )или требуется другая авторизация (401 ), я могу легко сократить возврат и вручную установить код состояния и любой другой контент, и это круто. Однако во многих состояниях, отличных от -2xx, я хочу вернуть тело объекта -, отличное от представления ресурса Hammer. Я могу легко сделать это вручную, но я хотел бы воспользоваться преимуществами автоматической сериализации и десериализации веб-API ASP.NET MVC 4 в/из XML или JSON в зависимости от заголовков запроса.

Итак, мой основной вопрос: :Могу ли я воспользоваться преимуществами автоматической сериализации веб-API ASP.NET MVC 4, возвращая различные типы возвращаемых данных?

Вот некоторые потенциальные подходы, о которых я подумал::

  1. Метод контроллера должен возвращать основной тип ресурса, но закорачивать -возврат с помощью HttpContext.Current.Responseи каким-то образом подключаться к автоматической сериализации (предпочтительно ).

  2. Мой класс Model должен быть больше похож на объединение C, где он представляет тот или иной тип, и позволить ему быть сериализованным как часть нормального процесса возврата (и просто переопределить код состояния и любые необходимые заголовки ответа ). Даже если я подумаю, как это сделать, у меня есть чувство, что это все равно будет очень хакерским.

Отредактировано 27 апреля 2012 г.:Я могу генерировать исключение HttpResponseException, подобное этому:

HttpResponseMessage response = new HttpResponseMessage(statusCode);
if (!string.IsNullOrWhiteSpace(text))
{
    response.Content = new StringContent(text);
}
throw new HttpResponseException(response);

... но теперь мне нужно выяснить, как подключиться к автоматической -магической сериализации и установить response.Contentв Acceptсогласованное представление заголовка.

10
задан abatishchev 18 May 2016 в 07:04
поделиться