Использование оболочки сессии в ASP. Net Core Razor Pages - PullRequest
0 голосов
/ 12 февраля 2020

Чтобы улучшить обработку сеансов в нашем приложении, мы хотели создать класс-оболочку, который управляет доступом к сеансам через свойства (чтобы избежать распространенных проблем при работе со строками).

Примерно так:

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

Существует довольно много примеров того, как реализовать это в classi c ASP. Net, но мы не смогли перенести их на ASP. Net Core. Единственный другой вопрос об обертке сессии в ASP. Net Core (который я смог найти) - это использование Singleton, который мы не нашли подходящим для нашего случая.

Наша проблема сводится к двум основным вопросам:

  • Как правильно обернуть и получить доступ к текущему сеансу внутри другого класса (избегая анти-паттернов и проблем безопасности)
  • Как поделиться класс по нашему приложению

1 Ответ

0 голосов
/ 12 февраля 2020

Мы решили использовать функциональность внедрения зависимостей ASP. Net Core, так как она казалась идеально подходящей для работы. Для доступа к сеансу внутри службы необходим IHttpContextAccessor . Как указано в ASP. NET Core Diagnosti Дэвида Фаулера c Scenar ios, рекомендуется не хранить 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";
    }
  }

Я публикую ответ в надежде получить отзыв о моем решении. а также предоставление ориентира для других, борющихся с этим.

...