繁体   English   中英

在 ASP.Net Core Razor Pages 中使用会话包装器

[英]Using a session wrapper in ASP.Net Core Razor Pages

为了改进我们应用程序中的会话处理,我们想创建一个包装类,它通过属性管理会话访问(以防止在处理字符串时出现常见问题)。

像这样的东西:

  public class Wrapper
  {
    public string Username
    {
      get { return HttpContext.Current.Session.GetString("username"); }
      set { HttpContext.Current.Session.SetString("username", value); }
    }
  }

有很多示例说明如何在经典 ASP.Net 中实现这一点,但我们无法将它们移植到 ASP.Net Core。 关于 ASP.Net Core 中的会话包装器的唯一其他问题(我能找到)是使用单例,我们认为它不适合我们的情况。

我们的问题归结为两个主要问题:

  • 如何在另一个类中正确包装和访问当前 Session(避免反模式和安全问题)
  • 如何在我们的应用程序中共享类

我们决定使用 ASP.Net Core 的依赖注入功能,因为它看起来非常适合这项工作。 要访问服务内部的会话,需要IHttpContextAccessor 正如 David Fowler 的ASP.NET Core 诊断方案中所述,建议不要将IHttpContextAccessor.HttpContext存储在字段中,但是使用范围服务应该可以缓解这个问题,因为它是为每个请求创建的

我们的设置

这里我们使用HttpContextAccessor来引用当前会话。 通过使用属性来限制对会话的访问(字符串可以进一步替换为常量)。

  public class SessionService
  {
    private readonly ISession _session;

    public SessionService(IHttpContextAccessor accessor)
    {
      _session = accessor.HttpContext.Session;
    }

    public string Username
    {
      get { return _session.GetString("username"); }
      set { _session.SetString("username", value); }
    }
  }

然后将会话包装器配置为Startup.cs内的范围服务:

public void ConfigureServices(IServiceCollection services)
{
  services.AddRazorPages();
  // ...

  // Register the service we use for session handling.
  services.AddScoped<SessionService>();
}

最后但并非最不重要的是,该服务被注入到我们的页面模型中,并用于通过其属性访问会话。

  public class IndexModel : PageModel
  {
    private readonly ILogger<IndexModel> _logger;
    private readonly SessionService _session;

    public IndexModel(ILogger<IndexModel> logger, SessionService session)
    {
      _logger = logger;
      _session = session;
    }

    public void OnPost()
    {
      // Set the session variable.
      _session.Username = "foo@bar";
    }
  }

我发布了答案,希望得到有关我的解决方案的反馈,并为其他为此苦苦挣扎的人提供参考点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM