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

ASP.NET Web API - возвращает объект CLR или HttpResponseMessage

Какова, по-видимому, общая практика в Web API для возвращаемых типов из методов действий?

Возвращение объектов CLR следующим образом:

public IEnumerable<ContactModel> Get()
{
    return _contactService.GetAllForUser();
}

Или заверните свой объект в HttpResponseMessage:

public HttpResponseMessage Get()
{
    IEnumerable<ContactModel> contacts = _contactService.GetAllForUser();

    return Request.CreateResponse((HttpStatusCode) 200, contacts);
}

Я предпочитаю иметь свои собственные объекты CLR в качестве возвращаемого типа, поскольку это, очевидно, приводит к более чистым методам, так как вам не нужно каждый раз запускать создание HttpResponseMessage.

4b9b3361

Ответ 1

Важным моментом здесь является то, что этот выбор является вопросом ПРЕДПОЧТЕНИЕ. Если вы создаете HTTP-атрибут "URI-Style", где типы возврата известны заранее, клиентом, это может быть вашим предпочтительным подходом.

Однако лично мне не нравятся возвращаемые типы CLR. Я считаю, что, применяя этот подход, вы, вероятно, потеряете много преимуществ HTTP. Я всегда возвращаю HttpResponseMessage.

Если вы рассматриваете стандартный вызов процедуры, есть два возможных результата, вы возвращаете тип возврата или получаете исключение. Взаимодействие HTTP гораздо более гибко, чем из-за перенаправления, временных недоступных серверов, без содержания, немодифицированных, серверных соединений, предпочтений заголовков и т.д.

Я думаю, что класс ApiController - это место, где ваше приложение получает возможность сопоставить вызовы объектно-ориентированного метода в HTTP-запрос/ответы. Я думаю, что это сопоставление явно облегчает использование HTTP. Предоставляя инфраструктуре магическое преобразование типа CLR в какое-то проводное представление, оно сохраняет некоторую типизацию, но оно затушевывает происходящее и заставляет вас делать какие-либо HTTP-взаимодействия косвенно через ActionFilters и MessageHandlers.

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

Ответ 2

Я думаю, что первый вариант - лучший. В любом случае, если нет ошибки, код возврата будет 200 без каких-либо настроек на вашей стороне.

Если есть какое-либо исключение, вы можете отправить HttpResponseException с соответствующим кодом и сообщением

throw new HttpResponseException(
    Request.CreateResponse<string>(HttpStatusCode.BadRequest, 'Your message'))