Распределенный кеш Session возвращает NULL для отдельных запросов, почему? - PullRequest
1 голос
/ 26 февраля 2020

пожалуйста, помогите! Проект представляет собой веб-приложение .NetCore 3.1 MVC. У меня возникла проблема при попытке заставить мой сеанс работать с моим распределенным кэшированием. Кэш-память работает хорошо, она сохраняется на сервере SQL и также хорошо восстанавливается. затем я проверил сессию ... Если я установил один запрос и попытался получить другой запрос, я ВСЕГДА получаю значение NULL, я просмотрел все возможные руководства и не смог решить проблему. Стоит отметить, что сеанс сохраняется в моей базе данных, я просто не могу получить к нему доступ! это мой стартап:

#define SQLServer // Redis





using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Builder;

using Microsoft.AspNetCore.Hosting;

using Microsoft.AspNetCore.Http;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Hosting;



namespace DigitalBusiness.Caching.WebTester

{

    publicclassStartup

    {

        publicStartup(IConfiguration configuration, IWebHostEnvironment hostEnviroment)

        {

            Configuration = configuration;

            HostEnviroment = hostEnviroment;

        }



        public IConfiguration Configuration { get; }

        public IWebHostEnvironment HostEnviroment { get; }



        // This method gets called by the runtime. Use this method to add services to the container.

        publicvoid ConfigureServices(IServiceCollection services)

        {

            services.AddControllersWithViews();

            services.AddHttpContextAccessor();

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();



            if (HostEnviroment.IsDevelopment())

            {

                services.AddDistributedMemoryCache();

                services.AddSession();

            }

            else

            {

#if SQLServer

                services.AddDistributedSqlServerCache(options => {

                    options.ConnectionString = Configuration["RawData"];

                    options.SchemaName = "dbo";

                    options.TableName = "SessionCache_Test_To_Remove";

                });

                services.AddSession(opts => {

                    opts.IdleTimeout = TimeSpan.FromSeconds(60);

                    opts.Cookie.HttpOnly = true;

                    opts.Cookie.IsEssential = true;

                });



#else

                services.AddStackExchangeRedisCache(options => {

                    options.Configuration = "localhost";

                    options.InstanceName = "SampleInstance"

                });

#endif

            }



        }



        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

        publicvoid Configure(IApplicationBuilder app, IWebHostEnvironment env)

        {

            if (env.IsDevelopment())

            {

                app.UseDeveloperExceptionPage();

            }

            else

            {

                app.UseExceptionHandler("/Home/Error");

            }

            app.UseStaticFiles();



            app.UseRouting();



            app.UseAuthorization();



            app.UseSession();



            app.UseEndpoints(endpoints =>

            {

                endpoints.MapControllerRoute(

                    name: "default",

                    pattern: "{controller=CacheTester}/{action=Index}/{id?}");

            });

        }

    }

}

и это мои методы контроллера. Примечание: когда я пытаюсь получить доступ к данным Session, я вижу sessionCook ie в первом вызове, возвращаемом клиенту. но он не добавляется к последующим запросам к серверу ... кроме того, Expire всегда равен -1.




        public void GetSession()

        {
//When i call this method, after i called the "SetSession" before, i get NULL

            var t = HttpContext.Session.GetString("123");

        }


        [HttpPost]

        public void SetSession([FromBody]model postData)

        {

            HttpContext.Session.SetString("123", "asd");

//Here i get the session value with no issues!

            var t = HttpContext.Session.GetString("123");


        }

Пожалуйста, спасите меня :( Заранее спасибо, ребята!

1 Ответ

0 голосов
/ 26 февраля 2020

У меня ушло почти два дня, чтобы найти проблему, возникшую в неожиданном месте ... проклятый клиент! я использовал выборку MDN, но не добавил «Allow-Credentials: true», что означает, что повар ie никогда не сохранялся браузером ...

простая ошибка ладьи ie, которая закончилась заняло так много времени ... Я надеюсь, что если у вас возникнет та же проблема, вы сможете решить ее быстрее, используя мой ответ <3 </p>

...