HttpContext.Current.Session null с DependencyInjectionProvider

#c# #asp.net #.net #visual-studio

#c# #asp.net #.net #visual-studio

Вопрос:

Я использую DependencyInjectionProvider, и когда я проверяю контейнер, я получаю нулевую ссылку на сеанс. Может кто-нибудь сказать мне, как это решить? Мой код выглядит следующим образом:

Код 1:

 private Container Init()
    {
        var container = new Container();
        container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
        container.Register<ConnectionString>(() => UserContext.Current?.connectionString ?? new ConnectionString(ConfigurationManager.AppSettings["banco_cliente"]), ScopedLifestyle.Scoped);
        SimpleInjectorContainer.RegisterMvc(container);
        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
        container.Verify();
        return container;
    }
 

Код 2 (текущий атрибут UserContext):

 public static Current Current
    {
        get
        {
            try
            {
                if (HttpContext.Current.Session["__contexto_do_usuario_logado__"] == null)
                    Inicializar();
                return HttpContext.Current.Session["__contexto_do_usuario_logado__"] as Current;
            }
            catch
            {
                return null;
            }
        }
    }
 

Комментарии:

1. Я не понимаю, как код в первом блоке кода имеет какое-либо отношение ко второму блоку кода. Куда вызывается Init() вызов? Какую инфраструктуру внедрения зависимостей вы используете?

2. Init () — это метод, который вызывает атрибут, вызывающий проблему. Я думаю, что плагин вызывает SimpleInjector. Я новичок в C #, и это проект от компании, над которой я сейчас работаю

3. Init Вызывается в контексте пользовательского запроса? Если нет, то почему должен быть HttpContext? И если это так… тогда почему вы создаете контейнер в любое время, кроме запуска приложения?

4. Вы добавили промежуточное программное обеспечение UseSession? Может быть не связано, но передайте его назад

5. Куда бы я поместил код промежуточного программного обеспечения? Я новичок в ASP.NET и это проект, к которому я недавно присоединился

Ответ №1:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//I'd put this toward the end of the code block but before your routing.
app.UseSession();
}
 

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

Комментарии:

1. должен ли этот файл находиться в Startup.cs?

2. Я предположил, не проверяя… Это решение предназначено для aspnet.net основные проекты. Внутри вашего startup.cs у вас будет метод configure, просто нужно добавить строку