Пакетный JSON API в .NET MVC 3 - PullRequest
       27

Пакетный JSON API в .NET MVC 3

0 голосов
/ 30 марта 2012

Я уже некоторое время работаю над проектом, который разделен между тем, что мы называем «паутинами» (я знаю, плохое имя) и «зданиями».Каждая сеть может иметь 1 или более зданий, и когда вы входите в систему, вы входите в определенную сеть.Традиционно это было настроено как отдельные vhosts в IIS, таким образом, они фактически были отдельными веб-сайтами, за исключением того факта, что все они работали на одной и той же кодовой базе, однако новая система, которая пишется, удаляется от этого шаблона.

Также в старой системе;то здание, которое вы просматривали в данный момент, было сохранено в переменной сеанса, другими словами, нельзя было ни на что не ссылаться.Скажем, например, что вы входите в сеть 01 в здании 01 и переходите к файлу ao_list.asp (старая сеть была классическим asp), в результате вы получите URL-адрес, выглядящий как-то по web01.domain.com/ao/ao_list.asp, однако вновая система, у вас будет такой URL: domain.com/web-01/building-01/ao/.Эта причина приводит вас к Index -методу AOViewController.

. Все это работает в настоящее время, и с навигацией вообще нет проблем.В дополнение к указанному URL;есть URL-адрес API, который точно соответствует веб-URL, заданному domain.com/api/web-01/buildin-01/ao/.Это также прекрасно работает.

Но отсюда возникает проблема.Декорирование каждого Контроллера в проекте - это пользовательский AuthorizeAttribute, который я написал, который учитывает, какое здание / сеть вы просматриваете, проверяя права пользователя.Например;Ни один пользователь не должен иметь доступ к веб-сайтам, которые не относятся к его пользовательскому веб-сайту.И пользователи могут иметь разные права на разные здания.

Атрибут работает, получая здание и веб-номер из словаря маршрутов, а затем использует его при расчете прав пользователя, и это работает так, как если быподозреваемого.Тем не менее, была доказана необходимость в API-методах, которые могут объединять API-вызовы в нескольких зданиях, и я изо всех сил пытаюсь выяснить, как я могу их реализовать.

Например;всякий раз, когда пользователь переходит на стартовую страницу приложения;ajax-запросы сделаны, чтобы получить список над выдающимися AO в каждом здании, к которому у пользователя есть доступ.В настоящее время делается один запрос на здание, что может привести к сотням запросов в худшем случае.Эта причина неприемлема, поэтому я хотел бы иметь возможность сделать что-то вроде вызова GET /api/web-01/ao/?buildings=01,02,03,04,06, затем перебрать здания на стороне сервера и вернуть что-то вроде этого:

[
    {"building":"01","data":<result of calling /api/web-01/building-01/ao>},
    {"building":"02","data":<result of calling /api/web-01/building-02/ao>},
    {"building":"03","data":<result of calling /api/web-01/building-03/ao>},
    etc...
]

И, конечно же, я хотел бы просто получить сообщение об ошибке, если какие-либо разрешения были нарушены по пути.

Есть ли хороший способ реализовать это без изменения фактической реализации Index -метод API.AOController?

В настоящее время я реализую здания, добавляя простой поиск в словаре маршрутов во время OnActionExecuting в базовом контроллере, который расширяют все мои контроллеры, поэтому я подумал, чтоЯ мог бы проверить наличие параметра building-querystring-параметр и, если он присутствовал, создать несколько экземпляров текущего контроллера, установить переменную building на «дочернем» контроллере и вызвать соответствующий метод, но я не знаюесли это хороший способ сделать это, и я не знаю, как вызвать AutorizeAttribute для «потомка»так что то, что я спрашиваю (после написания всего этого), является хорошим способом хорошо решить эту проблему:).

[Edit]

TLDR;

У меня есть настройка страницы mvc3 с URL-адресами, такими как:
domain.com/api/web-01/buildin-01/ao/
domain.com/api/web-01/buildin-02/ao/
и т. Д.
Это все вызовы API, которые возвращают данные JSON после выполненияпользовательский атрибут Autorize.Я хотел бы иметь возможность делать что-то вроде domain.com/api/web-01/ao/?buildings=01,02, что привело бы к получению суммарного ответа двух вышеупомянутых вызовов (сгруппированных по их соответствующей причине), в то же время выполняя атрибут Autorize для каждого строительство. И если этот атрибут Autorize потерпит неудачу для одного из зданий, то весь запрос потерпит неудачу. А также; Я хотел бы иметь возможность сделать это, не меняя реализацию Index -метода AOController, а вместо этого вызывая его несколько раз. Я думаю, что я хочу добиться того, чтобы один запрос «действовал» так, как если бы он был на самом деле несколькими запросами, без создания нескольких запросов контекста (которые порождали бы соединения с базой данных и т. Д.). Это возможно?

...