c# - 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 页面
解决方案
1-在ConfigureServices
方法中,请确保您已设置CheckConsentNeeded
为 false。
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
2- 调用AddSession
in 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();
推荐阅读
- git - 如何在 Visual Studio 中从远程服务器查看新的 GIT 分支?
- cuda - 安装了 cuda 10.1 但安装了 nvcc -V display 9.1
- python - Python 上的 SSL 问题
- python - 如何忽略lookbehind中的特定单词?
- arrays - 合并数组内的对象
- c# - 如何在 C# 中从 Pipeline.Invoke 转换 PSCustomObject
- python-3.x - 如何从 Azure 函数应用发送电子邮件?
- php - Woocommerce 根据所选变量隐藏/显示变量
- terraform-provider-aws - Terraform 脚本在创建新的之前破坏先前创建的 ec2
- python - 每当我尝试通过 Django 中的表单编辑任何条目时,我都会收到“AttributeError”