Конвейер выполнения MVC: вызов Ajax перед инициализацией контроллера - PullRequest
0 голосов
/ 03 октября 2018

У меня архитектурное недопонимание порядка выполнения в MVC.

Я переопределяю инициализацию в моем

public class HomeController: Controller {

    protected override void Initialize(RequestContext requestContext)
    { 
       var myVar = "AValue";
       // basically run some internal security 
       initialization
    }

Затем в моем javascript я выполняю серию из 10 вызовов Ajax сотложенное обещание ().

Onload устанавливает и запускает с $, когда

Тогда <- не ключевое слово, просто другое местоположение </p>

js:

this.BeginMyAjaxQuery = function() {
   methodName:  MyAjaxQuery
};

На совершенно другом контроллере , который наследует мой HomeController

public JsonResult MyAjaxQuery()
{           
     return Perform(() =>
     { 
        return ThisQueryWithMyParameter(AValue); 
     });
 }

Perform - это обертка, которую мы успешно использовали для создания JsonResults

На мое недопонимание того, как архитектура MVCведет себя: когда я загружаю свой URL, AJAX полностью проходит в своем собственном потоке, прежде чем я завершу инициализацию HomeController.Таким образом, мои переменные не установлены, и когда я приступаю к фактическому выполнению запроса, я получаю неправильные результаты ... большую часть времени, но не всегда.Что, конечно, еще более раздражает.

Как мои вызовы ajax могут обойти мою инициализацию контроллера и перейти непосредственно к методам контроллера?

Добавить в заблуждение Добавление моего кода вКонструктор на моем HomeController ведет себя так же.Ошибочные результаты.

Последние биты, если это имеет значение: Использование частичных представлений и KnockoutJS для доставки переднего плана

1 Ответ

0 голосов
/ 04 октября 2018

Проблема staic

Как вы уже описали, вы используете static .Хотя это помогает получить к нему доступ практически везде, но у него есть другое свойство: оно инициализируется только один раз, и значение, которое вы ему присваиваете, является значением, имеющимся во всех потоках.(Ну, на самом деле у этого есть немного больше нюансов, таких как кэширование на уровне процессора, но я пока считаю, что это выходит за рамки.)

На данный момент: вы должны рассмотреть это, как будто есть только 1 Security User объект в памяти.Если вы дадите ему значение, оно будет таким во всех потоках.

public class HomeController: Controller {

    //note! static: the `new` is called only once!
    static SecurityUser = new SecurityUser();

    protected override void Initialize(RequestContext requestContext)
    { 
       //so SecurityUser is not a fresh object.
       //setting values will be shared between all 
       //threads (since there is only one SecurityUser object in memory

       //shared across all threads
       SecurityUser.Ip = "127.0.0.2";
    }


Трубопровод MVC

Как Википедия гласит:

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

В общем случае он описывает потокданных и действий, выполняемых при обработке запроса.

Везде есть статьи об этом, например: здесь и здесь .

MSDNИзображение объясняет это очень хорошо (и завершено), я добавил его ниже.

Если вы посмотрите на изображение, вы увидите AuthenticationFilters, AuthorizationFilters и ActionFilter s.(См. Эту ссылку для получения дополнительной информации о них.)

Их цель - выполнить код, аутентификацию и т. Д. Для некоторых или всех вызванных ActionMethods.Используя их, вы можете изолировать свое поведение аутентификации (что является хорошей практикой ОО) и поддерживать ваш код в обслуживании.Идея в том, что вам нужно будет определить свою специальную функцию безопасности только один раз.

Вы можете использовать это для инициализации объекта с определенным интерфейсом, например: ISecurity с некоторыми свойствами, такими как IP-адрес, имя пользователя, права администратора и т. Д. Объект может быть заполнен в фильтре действий и может бытьразрешается с помощью средства разрешения зависимостей в каждом вызове http.Работает как шарм.

enter image description here источник изображения: msdn

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