【问题标题】:Why session is getting null in ASP.NET Core web api in .net core 3.0?为什么会话在 .net core 3.0 中的 ASP.NET Core Web api 中为空?
【发布时间】:2019-09-26 02:13:16
【问题描述】:

我还在我的项目中使用会话。它在本地主机中运行良好。在我发布到服务器后,如果我由邮递员发布,会话可以工作,但如果由远程服务器发布,则会话无效。

我在Session variable value is getting null in 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);
}

如您所见,我已经通过记录器对控制器进行了测试。设置后&返回前会话运行良好(不仅在本地主机中,而且在服务器中)。

但是,当远程服务器向服务器发布请求时,会话总是为空。

这是怎么回事?

【问题讨论】:

    标签: asp.net-core .net-core


    【解决方案1】:

    我看过微软官方教程:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.0

    据说:

    ASP.NET Core 通过向客户端提供一个包含会话 ID 的 cookie 来维护会话状态,该会话 ID 随每个请求一起发送到应用程序。应用使用会话 ID 来获取会话数据。

    这意味着它需要 cookie 来获取会话。简而言之,我的项目只需要获取/设置一个过期的静态变量,所以我认为我应该最好使用会话。现在我认为我还不需要在我的项目中使用 cookie。

    在文章的最后,我注意到另一件事:内存缓存https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.0

    然后我进行测试以使用内存缓存来替换会话。嗯,效果不错。

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 2020-07-31
      • 2020-04-11
      • 2018-09-21
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多