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();
}
}
Обновлен ответ в соответствии с запросом
Синглтоны в веб-среде не всегда так просто создавать и использовать.
В веб-приложениях мы могли бы рассмотреть возможность использования трех видов синглетонов:
- Один экземпляр на веб-запрос
- Один экземпляр на пользователя (сеанс)
- Один экземпляр на все веб-приложение (чаще всего используется)
Первые два случаяэто действительно проблема;Что меня действительно интересует, так это третий пункт: «Один экземпляр на целое веб-приложение», который иногда может быть немного хитрым.
Обычно применяется стандартный шаблон 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 - когда каждый запрос записывает некоторые данные в один и тот же файл.Мы могли бы представить, что произойдет, если два «синглета» попытаются записать в один и тот же файл одновременно.
Чтобы решить эту проблему, нам нужно обмениваться данными между рабочими потоками, чтобы все они имели доступ ксинглтон, который существует только в одном из них.
Надеюсь, это поможет.