Лучший способ отличить контроллеры MVC на основе заголовков HTTP

StackOverflow https://stackoverflow.com/questions/78823

Вопрос

Проблема

Мой текущий проект требует от меня выполнения разных действий на основе разных заголовков HTTP-запросов почти для каждого действия.

В настоящее время у меня есть один массивный контроллер (все для одного и того же типа ресурса), и каждый метод действия имеет атрибут ActionName (так что я могу иметь несколько версий одного и того же действия, которое принимает одни и те же параметры, но выполняет разные действия) и собственный FilterAttribute (реализован почти так же, как AcceptVerbsAttribute в предварительной версии 5), который проверяет, имеют ли определенные заголовки определенные значения.

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

Пример

Например, скажем, у меня есть список файлов.Служба должна обработать запрос одним из двух способов:

  1. Клиент хочет zip-файл и передает «accept:application/zip» в качестве заголовка, я беру список файлов, упаковываю их в zip-файл и отправляю обратно клиенту.

  2. Клиенту нужна html-страница, поэтому он передает «accept:text/html", сайт отправляет обратно HTML-страницу в формате таблицы со списком файлов.

Это было полезно?

Решение

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

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

Однако, если логика совершенно другая, вы можете реализовать собственное ограничение маршрутизации (IRoutConstraint), которое вы прикрепляете к каждому маршруту.Взгляните на реализацию HttpMethodConstraint для идей.

Другие советы

Я не уверен, что вам нужны отдельные контроллеры на основе заголовка;эта структура звучит совершенно разумно.Если ваш контроллер, как вы говорите, огромен, подумайте, имеет ли он дело с несколькими ресурсами, и если да, возможно, его следует разделить на несколько контроллеров в зависимости от ресурса?

Не уверен, что это возможно, но похоже, что это будет что-то вроде атрибута AcceptVerbs, который был добавлено в превью 5.Я бы посмотрел, как это было реализовано (получил исходный код MVC), чтобы посмотреть, сможете ли вы добавить что-то подобное в зависимости от типа контента.

Вам следует посмотреть эта почта.Он описывает реализацию ответов json и xml на основе заголовка http.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top