我正在将会话变量保存在登录页面中,
Guid sessionId = Guid.NewGuid();
HttpContext.Session.SetString("sessionId",sessionId.ToString());
Response.Cookies.Append("sessionId", sessionId.ToString());
现在,我可以像这样访问此变量:
string sessionId = Request.Cookies["sessionId"];
if (!String.IsNullOrEmpty(sessionId) && sessionId.Equals(HttpContext.Session.GetString("sessionId")))
{
return RedirectToPage("/LoggedIn/Index");
}
return Page();
我在声明会话ID的同一剃刀页面(登录页面)上使用此代码,但是,如果在任何其他剃刀视图页面中使用以上代码,则无法访问此会话变量。它只能在与保存页面相同的页面上访问。
我可能做错了什么?
答案 0 :(得分:2)
我不得不更改我之前评论的整个上下文。这是“正确答案”。
只需确保已检查以下步骤:
services.AddDistributedMemoryCache()
内存配置为用于缓存。services.AddSession()
您已配置会话。app.UseSession()
之后和app.UseCookiePolicy()
之前致电app.UseMvc()
。 **请注意,RedirectToPage()
调用根本不会影响/更改会话变量。 **
这些步骤看起来很基础,但实际上,第3步是您要寻找的答案。您的代码看起来绝对不错。
这是Rick Anderson和Steve Smith概述的中间件订购 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/index?view=aspnetcore-2.2#order
有时,此问题可能是由于在配置CookiePolicyOptions时将CheckConsentNeeded = context => true
设置为true引起的。如果您已配置<CookiePolicyOptions>
,只需将其设置为false。
答案 1 :(得分:0)
您应该首先在Startup.cs中配置HttpContextAccessor和Session。
//ConfigureServices
services.AddHttpContextAccessor();
services.AddSession(s => s.IdleTimeout = TimeSpan.FromMinutes(30));
和
//Configure
app.UseSession();
然后,您可以在任何地方通过IHttpContextAccessor访问HttpContext。我已经在“索引”操作中设置了会话。
public class HomeController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public IActionResult Index()
{
_httpContextAccessor.HttpContext.Session.SetString("session1", Guid.NewGuid().ToString());
return View();
}
}
并在About.cshtml中访问它
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
<h1>Session Value:</h1>
<p>@HttpContextAccessor.HttpContext.Session.GetString("session1")</p>
希望这会有所帮助。
答案 2 :(得分:0)
您需要存储会话数据。您可以将内存缓存用于大多数应用程序。您可以在ConfigureServices方法中使用services.AddMemoryCache()
启用它。参见https://www.learnrazorpages.com/razor-pages/session-state
答案 3 :(得分:-1)
我相信您需要使用.Net Core中的Context.Session.TryGetValue
而不是HttpContext
您将在视图中使用@using Microsoft.AspNetCore.Http;
名称空间