Я пытаюсь написать по-настоящему 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, возвращая различные типы возвращаемых данных?
Вот некоторые потенциальные подходы, о которых я подумал::
Метод контроллера должен возвращать основной тип ресурса, но закорачивать -возврат с помощью HttpContext.Current.Response
и каким-то образом подключаться к автоматической сериализации (предпочтительно ).
Мой класс 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
согласованное представление заголовка.