Как поддерживается сеанс запроса в Singleton Services - PullRequest
0 голосов
/ 08 февраля 2019

Я настраиваю свои службы при загрузке файла, как показано ниже.Для получения ответа в DocClient будет сделано несколько звонков.В качестве его синглтона будет общий объект, думающий сервер.Как это обеспечить и поддерживать сеанс для всего запроса.

services.AddSingleton ()

1 Ответ

0 голосов
/ 11 февраля 2019

ASP.NET Core поддерживает состояние сеанса, предоставляя клиенту файл cookie, содержащий идентификатор сеанса, который отправляется приложению при каждом запросе.Приложение использует идентификатор сеанса для извлечения данных сеанса.

Состояние сеанса демонстрирует следующее поведение:

Поскольку файл cookie сеанса является специфическим для браузера, сеансы не 'Т разделяется между браузерами.Сеансовые куки удаляются после завершения сеанса браузера.Если для сеанса с истекшим сроком действия получен файл cookie, создается новый сеанс, который использует тот же файл cookie сеанса.Пустые сеансы не сохраняются - в сеансе должно быть установлено хотя бы одно значение для сохранения сеанса между запросами.Когда сеанс не сохраняется, новый идентификатор сеанса генерируется для каждого нового запроса.Приложение сохраняет сессию в течение ограниченного времени после последнего запроса.Приложение либо устанавливает время ожидания сеанса, либо использует значение по умолчанию 20 минут.Состояние сеанса идеально подходит для хранения пользовательских данных, относящихся к конкретному сеансу, но в тех случаях, когда данные не требуют постоянного хранения между сеансами.Данные сеанса удаляются либо при вызове реализации ISession.Clear, либо по окончании сеанса.Не существует механизма по умолчанию для информирования кода приложения о том, что браузер клиента был закрыт или когда cookie-файл сеанса удален или истек срок его действия на клиенте.

Поставщик кэша в памяти сохраняет данные сеанса в памятисервер, на котором находится приложение.В сценарии фермы серверов:

-Используйте липкие сеансы, чтобы привязать каждый сеанс к конкретному экземпляру приложения на отдельном сервере.Служба приложений Azure по умолчанию использует маршрутизацию запросов приложений (ARR) для принудительной фиксации сеансов.Однако липкие сеансы могут влиять на масштабируемость и усложнять обновления веб-приложений.Лучшим подходом является использование распределенного кэша Redis или SQL Server, который не требует липких сессий.Дополнительные сведения см. В разделе Распределенное кэширование в ASP.NET Core .

. Сеансовый файл cookie шифруется с помощью IDataProtector.Защита данных должна быть правильно настроена для чтения файлов cookie сеанса на каждом компьютере.Дополнительные сведения см. В разделе Поставщики ASP.NET Core Data Protection и Key storage.

Настройка состояния сеанса Пакет Microsoft.AspNetCore.Session, включенный в метапакет Microsoft.AspNetCore.App., предоставляет промежуточное ПО для управления состоянием сеанса.Чтобы включить промежуточное программное обеспечение сеанса, автозагрузка должна содержать:

  • Любой из кэшей памяти IDistributedCache.Реализация IDistributedCache используется в качестве резервного хранилища для сеанса.Для получения дополнительной информации см. Распределенное кэширование в ASP.NET Core .
  • Вызов AddSession в ConfigureServices.
  • Вызов UseSession в Configure.

В следующем коде показано, как настроить поставщика сеансов в памяти со стандартной реализацией IDistributedCache в памяти:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
        });

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSession();
        app.UseHttpContextItemsMiddleware();
        app.UseMvc();
    }
}

Обновлен ответ в соответствии с запросом


Синглтоны в веб-среде не всегда так просто создавать и использовать.

В веб-приложениях мы могли бы рассмотреть возможность использования трех видов синглетонов:

  1. Один экземпляр на веб-запрос
  2. Один экземпляр на пользователя (сеанс)
  3. Один экземпляр на все веб-приложение (чаще всего используется)

Первые два случаяэто действительно проблема;Что меня действительно интересует, так это третий пункт: «Один экземпляр на целое веб-приложение», который иногда может быть немного хитрым.

Обычно применяется стандартный шаблон Singleton, так как по умолчанию есть только один рабочий.Проблема, с которой я сталкивался пару раз во время нескольких моих проектов, - как реализовать Singleton в среде с несколькими рабочими потоками.Если у нас есть только один рабочий поток, реализация Singleton на самом деле не является проблемой, поскольку все веб-запросы будут совместно использовать его статический экземпляр во всем рабочем потоке;единственная проблема заключается в том, как защитить ее, поскольку она все еще является многопоточной средой, и это можно просто предотвратить, добавив «блокировку», как в примере ниже.

public class Singleton {
    static Singleton instance = null;
    static readonly object padlock = new object();

    Singleton() { }

    public static Singleton Instance {
        get {
            lock (padlock) {
                if (instance == null) {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

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

Примером Singleton, для которого могут возникнуть проблемы с несколькими рабочими процессами, является класс File Logger - когда каждый запрос записывает некоторые данные в один и тот же файл.Мы могли бы представить, что произойдет, если два «синглета» попытаются записать в один и тот же файл одновременно.

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

Надеюсь, это поможет.

...