Wartość zmiennej sesji otrzymuje null w ASP.NET Rdzeń

Ustawiam zmienną sesyjną w jednej metodzie i próbuję pobrać wartość zmiennej sesyjnej z innej metody w kontrolerze, ale zawsze dostaje null:

Oto Mój kod:

public class HomeController : Controller
{
    public IActionResult Index()
    { 
        HttpContext.Session.SetString("Test", "Hello!");
        var message = HttpContext.Session.GetString("Test");// Here value is getting correctly
        return View();
    }

    public IActionResult About()
    {
        var message = HttpContext.Session.GetString("Test"); // This value is always getting null here

        return View();
    }
}

Oto moja konfiguracja sesji w klasie Startup:

w metodzie ConfigureServices():

services.Configure<CookiePolicyOptions>(options =>
{
    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddDistributedMemoryCache();
services.AddMvc().AddSessionStateTempDataProvider();
services.AddSession(options =>
{
    options.Cookie.Name = "TanvirArjel.Session";
    options.IdleTimeout = TimeSpan.FromDays(1);
});

w metodzie Configure():

app.UseSession();
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

Bardzo dziwny i osobliwy problem! Każda pomoc będzie bardzo mile widziana!

Author: TanvirArjel, 2018-04-11

3 answers

Dla ASP.NET Core 2.1 i 2.2

W metodzie ConfigureServices klasy startowej Ustaw options.CheckConsentNeeded = context => false; następująco:

services.Configure<CookiePolicyOptions>(options =>
{
  // This lambda determines whether user consent for non-essential cookies is needed for a given request.
  options.CheckConsentNeeded = context => false;
  options.MinimumSameSitePolicy = SameSiteMode.None;
});
Problem rozwiązany!
 82
Author: TanvirArjel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-11 10:50:44

Możesz również po prostu ustawić {[1] } Jak wyjaśniono tutaj: https://andrewlock.net/session-state-gdpr-and-non-essential-cookies/

Istnieje przeciążenie services.AddSession(), które pozwala skonfigurować SessionOptions w pliku Startup. Możesz zmienić różne ustawienia, takie jak limit czasu sesji, a także dostosować plik cookie sesji. Aby oznaczyć plik cookie jako niezbędny, Ustaw IsEssential na true:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true; // consent required
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddSession(opts => 
    {
        opts.Cookie.IsEssential = true; // make the session cookie Essential
    });
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
 6
Author: Max Favilli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-14 07:38:27

Miałem ten sam problem i próbowałem następujących oddzielnie i stwierdziłem, że każdy z nich działa dla mnie!

 1. options.CheckConsentNeeded = context => false;
 2. opts.Cookie.IsEssential = true; // make the session cookie Essential

Jednak, nie do końca pewien, choć myślę, że #1 może potencjalnie prowadzić do naruszenia RODO. Stąd wolałabym #2.

 1
Author: Mujib Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-24 11:30:35