Как я могу предотвратить сброс Session.Id при каждом запросе? - PullRequest
0 голосов
/ 24 июня 2019

Я выполнил настройку сеанса для dotnet core 2.2, и все же новый сеанс создается с каждым запросом, включая Session.Id. Поэтому я не могу использовать сеанс в качестве держателя данных.

Я хотел бы использовать сеанс в связи с ShoppingCart.

Для этого я создал отдельный проект API, отдельный проект Service и отдельный проект SPA.

вот метод ConfigureServices

public void ConfigureServices(IServiceCollection services)
        {
            services.AddAutoMapper();
            // DbContext using SQL Server Provider
            services.AddDbContext<ICleanTasteDbContext, CleanTasteDbContext>(options =>
            {
                options.UseSqlServer(
                    Configuration.GetConnectionString("TasteConnection"),
                    m => m.MigrationsAssembly("Taste.Persistence")
                );
            });
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddDistributedMemoryCache();
            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromMinutes(30);
                options.Cookie.IsEssential = true;
                options.Cookie.HttpOnly = true;
            });
            services.AddHttpContextAccessor();

            // custome services
            services.AddTransient<ICartService<ICart>, CartService>();

            // MVC            
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            // Cors
            services.AddCors();

            services.AddSpaStaticFiles(config =>
            {
                config.RootPath = "wwwroot";
            });
        }

и вот метод Configure

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseCors(x =>
                    x.AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowAnyOrigin()
                    .AllowCredentials()
                    );
            app.UseAuthentication();
            app.UseDefaultFiles();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseSession();
            app.UseMvc(routes =>
            {
                routes.MapSpaFallbackRoute(
                    name: "spa-fallback",
                    defaults: new { controller = "fallback", action = "index" }
                );
            });

            app.UseSpa(spa =>
            {
                if (env.IsDevelopment())
                {
                    spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
                }
            });
        }

в CartsController сервис вызывается следующим образом

var cart = await cartService.Add(product);

в классе CartService IHttpContextAccessor внедряется и вызывается следующим образом

var cart = await httpContext.HttpContext.Session.Get<CartModel>(SESSION_NAME);
httpContext.HttpContext.Session.Set<CartModel>(SESSION_NAME, cart);

Он установлен правильно, но при следующем запросе появляется новый экземпляр сеанса и снова пуст.

Что я делаю не так?

Может ли это быть связано с тем, что я использую разные проекты?

1 Ответ

0 голосов
/ 24 июня 2019

Трудно сказать, но есть несколько потенциальных проблем:

  1. Вы используете сеансы в памяти, что означает, что вы привязаны к процессу.Сеансы никогда не будут разделены между двумя разными проектами, потому что каждый из них - это отдельный запущенный процесс со своей собственной поддержкой памяти.Кроме того, когда приложение останавливается, все, что хранится в памяти, идет вместе с ним, поэтому, если вы останавливаете и перезапускаете, например, отладку или даже просто перестраиваете, ваши сеансы прощаются.Там нет истинного "распределенного" кеша памяти.Это просто реализация IDistributedCache, которая использует память, но она не действительно распределена.

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

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