Лучший способ дифференцировать контроллеры MVC на основе заголовков HTTP - PullRequest
3 голосов
/ 17 сентября 2008

Задача

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

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

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

Пример

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

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

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

Ответы [ 4 ]

4 голосов
/ 17 сентября 2008

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

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

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

0 голосов
/ 14 марта 2009

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...