首页 > 解决方案 > ASP.NET CORE 3.1 读取没有初始值分配的会话时出现 NULL 异常错误

问题描述

HttpContext.Session.GetInt32("Id") 抛出空异常,因为当我的 c# 代码首先在我的布局页面上运行时,会话不会发生

会话之类的 okunduğunda sanırım henüz oluşturulmamış olduğu için null 异常 fırlatıyor。hatta login sayfasında session girildikten sonra bile layout sayfasında okurken null 异常 fırlatıyor。

 public ActionResult Login(string sifre, string email)
        {
            var url = HttpContext.Session.GetString("url");

            User UserSrgu = (from p in db.User
                             where p.Email == email && p.Sifre == sifre
                             select p).SingleOrDefault();
            if (UserSrgu == null)
            {
                TempData["sayfaMsj"] = "Lütfen E-mail ve Şifrenizi doğru giriniz!!!";
                return View();
            }
            if (UserSrgu.Onaylimi)
            {
                if (UserSrgu.ResimYol == null || UserSrgu.ResimYol == "")
                {
                    UserSrgu.ResimYol = "/Content/nullimgs/no-image_ex.png";
                }


                **HttpContext.Session.SetInt32("Id", UserSrgu.Id);
                HttpContext.Session.SetString("KAdi", UserSrgu.KAdi);
                HttpContext.Session.SetString("AdSoyad", UserSrgu.AdSoyad);
                HttpContext.Session.SetString("Email", UserSrgu.Email);
                HttpContext.Session.SetString("ResimYol", UserSrgu.ResimYol);**




                if (url != null)
                {
                    url = HttpContext.Session.GetString("url");
                }
                else
                {
                    url = "login";
                }
                return Redirect(url.ToString());
            }
            else
            {
                TempData["sayfaMsj"] = "Lütfen E-mail adresinize gelen linkten doğrulma yapınız!!!";
                return View();
            }
        }

layout.cshtml 页面

@page
@using Microsoft.AspNetCore.Http
@using System.Text
@{

    var contentKAdi = "";
    var contentAdSoyad = "";
    var contentEmail = "";
    var contentResimYol = "";
    int contentId = 0;

    try
    {
        ***usr = HttpContext.Session.Get<User>("user");
        contentId = (int)HttpContext.Session.GetInt32("Id"); 
        contentKAdi = HttpContext.Session.GetString("KAdi");***
    }
    catch
    {
        contentKAdi = "";
        contentAdSoyad = "";
        contentEmail = "";
        contentResimYol = "";
        contentId = 0;
    }


}

启动程序

    public void ConfigureServices(IServiceCollection services)
    {
        var connection = Configuration.GetConnectionString("xxZZDatabase");
        services.AddDbContext<xxZZContext>(option => option.UseSqlServer(connection));
        services.AddHttpClient();
        services.AddControllersWithViews();
        services.AddHttpContextAccessor();
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(10);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
            options.Cookie.Name = ".Erol.Aktepe";
        });

        services.Configure<CookiePolicyOptions>(options =>
        {           
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddDistributedRedisCache(options =>
        {
            options.InstanceName = "Oturum";
            options.Configuration = "127.0.0.1";
        });



        services.AddMvc(options => options.EnableEndpointRouting = false) 
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

    }



    [Obsolete]
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        app.UseSession();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();           
        }
        else
        {
            app.UseExceptionHandler("/Error");            
        }


        app.UseStaticFiles();


        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=xxxZZZ}/{action=Index}/{id?}");
        });
        app.UseMvc();

    }

SessionExtensions.cs

public static class SessionExtensions
{
    public static byte[] Get(this ISession session, string key);
    public static int? GetInt32(this ISession session, string key);
    public static string GetString(this ISession session, string key);
    public static void SetInt32(this ISession session, string key, int value);
    public static void SetString(this ISession session, string key, string value);
}

动作结果

......

            if (HttpContext.Session.Get<User>("user") == default(User))
            {
                HttpContext.Session.Set<User>("user", UserSrgu);
                var usr = HttpContext.Session.Get<User>("user");
            }
            HttpContext.Session.SetInt32("Id", UserSrgu.Id);
            var id = HttpContext.Session.GetInt32("Id");

..... UserSrgu.Id = 1 and UserSrgu -> full and id = null and usr = null

我通过使用 TempData 传递数据来传递 layout.cshtml 页面

标签: c#asp.net-mvcasp.net-core

解决方案


1-在ConfigureServices方法中,请确保您已设置CheckConsentNeeded为 false。

services.Configure<CookiePolicyOptions>(options =>
        {                
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

2- 调用AddSessionin ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddDistributedMemoryCache();

    services.AddSession(options =>
    {
        // Set a short timeout for easy testing.
        options.IdleTimeout = TimeSpan.FromSeconds(10);
        options.Cookie.HttpOnly = true;
        // Make the session cookie essential
        options.Cookie.IsEssential = true;
    });

3- 在startup.csConfigure中的方法你应该有:

  app.UseSession();

推荐阅读