новичок в контейнерах и вернулся на asp.net почти через десять лет, и я предполагал, что на этот вопрос уже где-то ответят, но, похоже, не могу его найти! У меня есть простое приложение asp.net, работающее на 3 узлах, логин, по-видимому, выполняется на каждый узел и теряется, когда запрос обслуживается другим узлом. Я предполагал, что будет учебник по распределенному управлению сеансом, но здесь нет никаких указателей / инструкций?
К вашему сведению - пока в разработке, но для общедоступного облачного решения azure / linode / ... работает 3 модуля
Информация о конфигурации / регистрации прилагается ниже.
Redis работает на локальном хосте, а не в контейнере докеров
поведение выглядит следующим образом
- скажем, пользователь вошел в pod1, всякий раз, когда запрос попадает в pod1, он показывает, что он вошел в систему,
- если запрос попадает в pod2 / pod3, он показывает, что не авторизован !!!
Похоже, что для того, чтобы сессия использовала redis, требуется что-то еще !!!
public void ConfigureServices(IServiceCollection services)
{
var cx = Configuration["RedisCache:ConnectionString"];
var redis = ConnectionMultiplexer.Connect(cx);
services.AddDataProtection().PersistKeysToStackExchangeRedis(redis, "DataProtectionKeys");
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20);
});
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseDeveloperExceptionPage();
//app.UseExceptionHandler("/Error");
app.UseHsts();
}
if (env.IsDevelopment())
{
app.UseHttpsRedirection();
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// Adds session middleware to pipeline
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
ПРИЛОЖЕНИЯ.JSON
{
"ConnectionStrings": {
"DefaultConnection": "Server=host.docker.internal;Database=SAMPLE;Trusted_Connection=false;user id=XXX;password=XXX;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"RedisCache": {
"ConnectionString": "host.docker.internal:6379,ssl=True,abortConnect=False"
},
"AllowedHosts": "*"
}
У меня есть следующая информация журнала в Index.cshtml.cs
public void OnGet()
{
var str = $"({Environment.MachineName}) || {HttpContext.Session.Id} || {DateTime.UtcNow.ToString("hh:mm:ss")}: Current({User.Identity.Name})";
_logger.LogWarning(str);
string sessionKey = "testKey1";
HttpContext.Session.SetString(sessionKey, str);
}