ASP MVC Autofac a koniec sesji

0

Witam. Takie pytanko jak obsłużyć koniec sesji przy skonfigurowanym Autofacu w aplikacji webowe ASP MVC 5.
Po zalogowaniu się usera klasy są wstrzykiwane do controllera i wszystko ładnie działa. Problem jest gdy wygasa sesja. Jak kliknę na jakieś menu to mam exception, że brak controllera o bez parametrowym konstruktorze. Czyli tak jakby nie mógł wstrzyknąć nic z Autofaca i uruchamia się metoda Application_error() z GlobalAsax.cs. Chciałbym to jakoś ładnie obsłużyć np z przekierowaniem na stronę, że sesja wygasła. Jakie są dostępne opcje aby ładnie to zrobić. Czy w Application_error sprawdzać stan sesji i jeśli jest zakończona to przekierowanie na odpowiednią stronę ?

private void ConfigureContainer()
        {
            var builder = new ContainerBuilder();
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            builder.RegisterAssemblyModules(typeof(MvcApplication).Assembly);
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
public class ServiceModule : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<ApplicationDbContext>().AsSelf().InstancePerRequest();
            builder.RegisterType<DelegationService>().AsSelf().InstancePerRequest();
            builder.RegisterType<DataAccess>().AsSelf().InstancePerRequest();
            builder.RegisterType<AdminService>().AsSelf().InstancePerRequest();
            builder.RegisterType<AccountancyService>().AsSelf().InstancePerRequest();
            builder.RegisterType<AccountCreator>().AsSelf().InstancePerRequest();
            builder.RegisterType<PdfService>().AsSelf().InstancePerRequest();                 
            builder.RegisterType<SummaryDelService>().AsSelf().InstancePerRequest();
            builder.RegisterType<BLL.EmailService>().AsSelf().InstancePerRequest();
            builder.RegisterType<CarService>().AsSelf().InstancePerRequest();
            builder.RegisterType<UserNotifyService>().AsSelf().InstancePerRequest();
            builder.RegisterType<ManagerService>().AsSelf().InstancePerRequest();
            builder.RegisterType<ApplicationUserManager>().AsSelf().InstancePerRequest();
            builder.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest();
            var dbContextParameter = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(DbContext),
                                                           (pi, ctx) => ctx.Resolve<ApplicationDbContext>());
            builder.RegisterType<UserStore<ApplicationUser>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();
            //var userStore = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(UserStore<ApplicationUser>), (pi, ctx) => ctx.Resolve<UserStore<ApplicationUser>>());
            //builder.RegisterType<UserManager<ApplicationUser>>().WithParameter(userStore);
            builder.Register(c => new UserStore<ApplicationUser>(c.Resolve<ApplicationDbContext>())).AsImplementedInterfaces().InstancePerRequest();
            builder.Register(c => new UserManager<ApplicationUser>(c.Resolve<UserStore<ApplicationUser>>())).AsSelf().InstancePerRequest();
            builder.Register(c => HttpContext.Current.GetOwinContext().Authentication).As<IAuthenticationManager>();
            builder.Register(c => new IdentityFactoryOptions<ApplicationUserManager>
            {
                DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("Delegacje")
            });

            builder.Register(
                c => c.Resolve<ApplicationUserManager>().FindById(HttpContext.Current.User.Identity.GetUserId()))
                    .As<ApplicationUser>();
            builder.RegisterType<UserService>().AsSelf().InstancePerRequest();
            builder.RegisterType<CurrencyService>().AsSelf().InstancePerRequest();
        }
    }
public void ConfigureAuth(IAppBuilder app)
        {
           
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                ExpireTimeSpan = TimeSpan.FromMinutes(1),
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Logowanie/Index"),
                SlidingExpiration = true,
                Provider = new CookieAuthenticationProvider
                {                    
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(1),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
                
            });
}

0

A jak aplikacja ma zareagować na coś, co jest poza requestem skoro ty masz prawie wszystko po rejestrowane per request.?

Nie dam sobie głowy urwać, że to jest to, ale no to wygląda.

0

Hmm. Wydawało mi się, że będzie wstrzykiwać jedną instancję w ramach pojedynczego http requesta. To jak to powinno być ustawione?

0

Z dokumentacji

When you register a component as InstancePerRequest(), you’re telling Autofac to look for a lifetime scope that is tagged as the request scope and to resolve the component from there.

Powinno być ustawione z głową. :|

1 użytkowników online, w tym zalogowanych: 0, gości: 1