Asp.Net Core Razor页面,无法从其他视图/剃刀模型访问会话变量

时间:2018-11-06 13:31:30

标签: c# asp.net-core session-variables asp.net-core-2.1 razor-pages

我正在将会话变量保存在登录页面中,

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的同一剃刀页面(登录页面)上使用此代码,但是,如果在任何其他剃刀视图页面中使用以上代码,则无法访问此会话变量。它只能在与保存页面相同的页面上访问。

我可能做错了什么?

4 个答案:

答案 0 :(得分:2)

我不得不更改我之前评论的整个上下文。这是“正确答案”。

只需确保已检查以下步骤:

  1. services.AddDistributedMemoryCache()内存配置为用于缓存。
  2. services.AddSession()您已配置会话。
  3. 在这里,人们会在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;名称空间