Razor 会话数据 - HttpContextAccessor 为空
Razor Session Data - HttpContextAccessor is null
我是 MVC5 新手,正在创建一个测试网站来查看 MVC5 和 Razor
用户登录后我有一个非常简单的站点,我需要通过 _Layout 更改菜单,从 "Login" 添加 "Logout" "Account"。
注意:该站点有自己的身份验证,稍后我将查看单点登录。
我真的很难在 MVC5 中管理会话数据,不确定哪种方法最好。我已经尝试过 TEMP DATA ,但是尽管我达到了顶峰,但我发现在用户被重定向到几个页面之后数据丢失了。所以看着好的旧 cookie,但自从 GDPR 以来,我可以看出对开箱即用的 cookie 的默认支持要少得多。
不管怎样,在初创公司我相信我做的都是正确的事情
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set session timeout value
options.IdleTimeout = TimeSpan.FromSeconds(30);
options.Cookie.HttpOnly = true;
});
}
services.AddMvc();
services.AddCaching();
services.AddSession();
services.AddHttpContextAccessor();
dependency 将其注入,但是在 Post 中,当我尝试调用 SetString 时,"private readonly IHttpContextAccessor _httpContextAccessor;" 为空
奇怪的是 _Layout 没有抛出相同的空异常
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
@{
string UserId = HttpContextAccessor.HttpContext.Session.GetString("UserId");
}
在处理 ASP.Net 之后,处理 Session 的简单方法开始质疑我是否遗漏了什么,因为在 MVC5 中似乎有很多工作要做。那么我应该在 MVC5 中使用不同的方法
设置
options.CheckConsentNeeded = context => false;
这是真的,即
options.CheckConsentNeeded = context => true;
并且您的会话将不再为空。
只想为其他人添加这个,可能不是最干净的代码
在 Sanjay 的帮助下,现在建立了一个粗糙的网站,运行
启动class,示例代码
public class 启动
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddHttpContextAccessor();
services.AddRazorPages();
services.AddRazorPages();
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(30);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
.csHtml 代码
@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor HttpContextAccessor
@{
if (Context.Session.GetString("UserRole") != null)
{
.cs 代码
private readonly IHttpContextAccessor HttpContextAccessor;
public LoginModel(ISiteUserService siteUserService,
IHttpContextAccessor httpContextAccessor)
{
this.HttpContextAccessor = httpContextAccessor;
}
public IActionResult OnGet()
{
if(HttpContextAccessor.HttpContext.Session.GetString("UserRole")!= null)
{
我是 MVC5 新手,正在创建一个测试网站来查看 MVC5 和 Razor
用户登录后我有一个非常简单的站点,我需要通过 _Layout 更改菜单,从 "Login" 添加 "Logout" "Account"。
注意:该站点有自己的身份验证,稍后我将查看单点登录。
我真的很难在 MVC5 中管理会话数据,不确定哪种方法最好。我已经尝试过 TEMP DATA ,但是尽管我达到了顶峰,但我发现在用户被重定向到几个页面之后数据丢失了。所以看着好的旧 cookie,但自从 GDPR 以来,我可以看出对开箱即用的 cookie 的默认支持要少得多。
不管怎样,在初创公司我相信我做的都是正确的事情
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set session timeout value
options.IdleTimeout = TimeSpan.FromSeconds(30);
options.Cookie.HttpOnly = true;
});
}
services.AddMvc();
services.AddCaching();
services.AddSession();
services.AddHttpContextAccessor();
dependency 将其注入,但是在 Post 中,当我尝试调用 SetString 时,"private readonly IHttpContextAccessor _httpContextAccessor;" 为空
奇怪的是 _Layout 没有抛出相同的空异常
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
@{
string UserId = HttpContextAccessor.HttpContext.Session.GetString("UserId");
}
在处理 ASP.Net 之后,处理 Session 的简单方法开始质疑我是否遗漏了什么,因为在 MVC5 中似乎有很多工作要做。那么我应该在 MVC5 中使用不同的方法
设置
options.CheckConsentNeeded = context => false;
这是真的,即
options.CheckConsentNeeded = context => true;
并且您的会话将不再为空。
只想为其他人添加这个,可能不是最干净的代码 在 Sanjay 的帮助下,现在建立了一个粗糙的网站,运行
启动class,示例代码
public class 启动 {
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddHttpContextAccessor();
services.AddRazorPages();
services.AddRazorPages();
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(30);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
.csHtml 代码
@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor HttpContextAccessor
@{
if (Context.Session.GetString("UserRole") != null)
{
.cs 代码
private readonly IHttpContextAccessor HttpContextAccessor;
public LoginModel(ISiteUserService siteUserService,
IHttpContextAccessor httpContextAccessor)
{
this.HttpContextAccessor = httpContextAccessor;
}
public IActionResult OnGet()
{
if(HttpContextAccessor.HttpContext.Session.GetString("UserRole")!= null)
{