Почему сессия становится нулевой в ASP.NET Core web api в .net core 3.0? - PullRequest
0 голосов
/ 26 сентября 2019

Я использую сессию в своем проекте еще.Это хорошо работает на местном хосте.После публикации на сервере сеанс работает, если я отправляю сообщение почтальоном, но не работает, если отправка выполняется удаленным сервером.

Я обнаружил ту же проблему в Значение переменной сеанса становится нулевым в ASP.NET Core

Я следую пути в вышеприведенной теме, но по-прежнему не работает.

Вот мой код:

public class Startup
{
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {            
            services.AddScoped<Global>();
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.Configure<GzipCompressionProviderOptions>(options => options.Level = System.IO.Compression.CompressionLevel.Optimal);
            services.AddMvc(
                options =>
            {
                options.OutputFormatters.Add(new Classes.XmlSerializerOutputFormatterNamespace());                
            }
            )
                .AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix,
                LocalizationOptions => LocalizationOptions.ResourcesPath = "Resources").AddXmlSerializerFormatters().AddXmlDataContractSerializerFormatters();
            services.AddLocalization(options => options.ResourcesPath = "Resources");


            services.AddHttpsRedirection(options =>
            {
                options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
                options.HttpsPort = 443;
            });
            services.AddHsts(options =>
            {
                options.Preload = true;
                options.IncludeSubDomains = true;
                options.MaxAge = TimeSpan.FromDays(60);
            });
            services.AddDistributedMemoryCache();

            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddSession(options =>
            {                
                options.IdleTimeout = TimeSpan.FromHours(1);                           
                options.Cookie.IsEssential = true;
            });           
        }

        [Obsolete]
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");                
                app.UseHttpsRedirection();
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            var SupportedCultures = new List<CultureInfo> 
            {
                 new CultureInfo("en"),
                 new CultureInfo("zh-Hans"),
                 new CultureInfo("zh-Hant")
            };

            var options = new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("zh-Hans"),
                SupportedCultures = SupportedCultures,
                SupportedUICultures = SupportedCultures,
            };
            app.UseRequestLocalization(options);
            var requestProvider = new RouteDataRequestCultureProvider();
            options.RequestCultureProviders.Insert(0, requestProvider);
            app.UseStaticFiles();

            app.UseStatusCodePagesWithReExecute("/StatusCode/{0}");

            app.UseRouting();
            app.UseAuthorization();
            app.UseSession();

            app.UseRouter(routes =>
            {
                routes.MapMiddlewareRoute("{culture=zh-hans}/{*mvcRoute}", subApp =>
                {
                    subApp.UseRequestLocalization(options);
                    subApp.UseRouting();
                    subApp.UseEndpoints(mvcRoutes =>
                    {
                        mvcRoutes.MapControllerRoute("default", "{culture=zh-hans}/{controller=Home}/{action=Index}");
                        mvcRoutes.MapControllerRoute("home.html", "{culture=zh-hans}/{controller=Home}/{action}.html");
                    });
                });
            });
        }
    }

А вот контроллер:

[HttpPost]
public async Task<IActionResult> abc(string i)
{
     if (HttpContext.Session.GetInt32(i) == null)
     {                
         HttpContext.Session.SetInt32(i, 1);
         _logger.LogInformation("Session is :" + HttpContext.Session.GetInt32(i).ToString());
         return Ok("First time.");
     }
     else
     {
        return Ok("Ran yet.");
     }

     return Ok(null);
}

Как видите, я выполнил проверку контроллера с помощью регистратора.Сеанс работает хорошо после установки и перед возвратом (не только на локальном, но и на сервере).

Однако, когда удаленный сервер отправляет запрос на сервер, сеанс всегда получает значение NULL.

Что не так с этим?

1 Ответ

0 голосов
/ 26 сентября 2019

Я прочитал об официальном руководстве Microsoft: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.0

Говорят:

ASP.NET Core поддерживает состояние сеанса, предоставляя клиенту файл cookie, содержащий идентификатор сеанса., который отправляется в приложение с каждым запросом.Приложение использует идентификатор сеанса для получения данных сеанса.

Это означает, что для получения сеанса ему необходимы файлы cookie.Короче говоря, мой проект просто должен получить / установить статическую переменную с истечением срока действия, поэтому я считаю, что лучше использовать сеанс.И теперь я не думаю, что мне нужно использовать куки в моем проекте.

В конце статьи я заметил еще одну вещь: кэширование в памяти https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.0

Затем ясделайте тест для использования кэширования в памяти для замены сеанса.Ну, это хорошо работает.

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