Разница между наследованием ApiController и IHttpController

В то время как я использую Microsoft.NET Framework уже несколько лет, я начинаю, когда речь идет о ASP.NET, в частности ASP.NET WebAPI Framework. Я рассматриваю возможность использования структуры ASP.NET WebAPI для небольшого проекта.

Я смотрел плакат ASP.NET WebAPI и заметил, что класс Controller может:

  • Вывести из класса ApiController или
  • Внедрить интерфейс IHttpController

Чтение документации MSDN для класса ApiController показывает, что оно реализует IHttpController. Похоже, что IHttpController просто объявляет один метод под названием ExecuteAsync().

Чего я не понимаю: при каких обстоятельствах следует вывести из ApiController или просто реализовать метод IHttpController интерфейса ExecuteAsync()? Каковы плюсы и минусы каждого подхода?

2 ответа

Если это то же самое, что и базовые контроллеры в MVC: проще всего получить только базовый класс (ApiController). Это обеспечивает дополнительный уровень абстракции между вами и некоторыми базовыми обработками запросов, что вы обычно хотите избежать самим собой.

В случае ASP.NET MVC вы можете создать свой собственный класс IController, если хотите настроить способ обработки запросов. Это включает в себя методы действий, рендеринг изображений и т.д.

Класс ControllerApiController) предоставляется ASP.NET как стандартная реализация всех этих вещей и дает вам предопределенные способы обработки запроса.

Используйте IHttpController, если вы хотите настроить все эти "низкоуровневые" вещи; используйте ApiController, если у вас нет особой необходимости изменять что-либо.

A Controller метод ExecuteAsync() (Execute в MVC) будет служить самой базовой точкой входа для запросов. Возврат данных из этого метода в виде представления включает в себя запись строки в ответ requestContext; вряд ли очень удобный способ работы.

Он позволяет вам определять свои собственные контроллеры и дает вам очень много возможностей для адаптации, но это также означает, что вам придется изобретать много колес.


Если вы используете IHttpController, нет выбора действий и фильтров действий. Вы просто получаете HTTPRequestMessage и возвращаете HTTPResponseMessage.

Использование IHttpController на самом деле является очень простым способом возврата контента, если ваши требования просты. Вы можете использовать все обычные объекты HttpContent, которые вы будете использовать в обычном действии ApiController.

public class SimpleController : IHttpController
{
 public async Task<httpresponsemessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
 {
 return new HttpResponseMessage(HttpStatusCode.OK)
 {
 RequestMessage = controllerContext.Request,
 Content = new StringContent("Hello World")
 };
 }
}
</httpresponsemessage>

licensed under cc by-sa 3.0 with attribution.