Asp.Net mvc - доступ к контейнеру IoC из Session_Start - PullRequest
0 голосов
/ 25 ноября 2010

Я хочу управлять своими файлами cookie, аналогичными http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/

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

Это нужно для того, чтобы позаботиться о функциональности типа «запомни меня» - подобно тому, как работает SO.

Для этого мне нужно иметь возможность извлекать сервисы из контейнера из метода Session_Start в global.asax. При отладке приложения я выполняю метод Application_Start, в котором создается контейнер. Все идет хорошо, и создается свойство Container файла global.asax. Но когда я захожу в Session_Start - контейнер становится пустым.

Что-то происходит, о чем я не знаю? Есть ли лучший способ сделать это?

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            Container = new WindsorContainer().AddFacility<WcfFacility>()
                .Install(Configuration.FromXmlFile("Configuration\\Windsor.config"))
                .Install(FromAssembly.InDirectory(new AssemblyFilter(HttpRuntime.BinDirectory, "SonaTribe*.dll")));


        }

        /// <summary>
        /// See http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Session_Start(object sender, EventArgs e)
        {
            if (Container != null)
            {
                var accountService = Container.Resolve<IAccountService>();
                var logger = Container.Resolve<ILogger>();
                var forms = Container.Resolve<IFormsAuthentication>();

                // if there is a cookie
                if (Context.Request.Cookies["user-id"] != null)
                {
                    try
                    {
                        //get the new cookie key from the server
                        var newUserSessionResponse = accountService.RegisterNewUserSession(new RegisterNewUserSessionRequest
                        {
                            SessionId = Context.Request.Cookies["user-id"].Value
                        });

                        if (newUserSessionResponse.Success)
                        {
                            //do something
                        }
                        else
                        {
                            logger.Info("Failed attaching the user to the session", newUserSessionResponse.Message);
                        }
                    }
                    catch (Exception exc)
                    {
                        logger.Error("Failed attaching the user to the session", exc);
                    }
                }
                else
                {
                    //new user:
                   //do things
                } 
            }
        }

Спасибо

ш: //

Ответы [ 2 ]

0 голосов
/ 26 ноября 2010

При реализации IContainerAccessor стандартная практика - хранить контейнер как статическую переменную глобального HttpApplication.См. http://hammett.castleproject.org/?p=233 для справки.

Если вы не используете статическую переменную, контейнер будет потерян, когда среда выполнения ASP.NET располагает HttpApplication (среда выполнения внутренне поддерживает пул экземпляров HttpApplication).

0 голосов
/ 25 ноября 2010

Переместите (объявление) контейнера в статический класс и убедитесь, что он (контейнер) является статическим.

...