Я использую сессию в своем проекте еще.Это хорошо работает на местном хосте.После публикации на сервере сеанс работает, если я отправляю сообщение почтальоном, но не работает, если отправка выполняется удаленным сервером.
Я обнаружил ту же проблему в Значение переменной сеанса становится нулевым в ASP.NET Core
Я следую пути в вышеприведенной теме, но по-прежнему не работает.
Вот мой код:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<Global>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.Configure<GzipCompressionProviderOptions>(options => options.Level = System.IO.Compression.CompressionLevel.Optimal);
services.AddMvc(
options =>
{
options.OutputFormatters.Add(new Classes.XmlSerializerOutputFormatterNamespace());
}
)
.AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix,
LocalizationOptions => LocalizationOptions.ResourcesPath = "Resources").AddXmlSerializerFormatters().AddXmlDataContractSerializerFormatters();
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddHttpsRedirection(options =>
{
options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
options.HttpsPort = 443;
});
services.AddHsts(options =>
{
options.Preload = true;
options.IncludeSubDomains = true;
options.MaxAge = TimeSpan.FromDays(60);
});
services.AddDistributedMemoryCache();
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromHours(1);
options.Cookie.IsEssential = true;
});
}
[Obsolete]
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHttpsRedirection();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
var SupportedCultures = new List<CultureInfo>
{
new CultureInfo("en"),
new CultureInfo("zh-Hans"),
new CultureInfo("zh-Hant")
};
var options = new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("zh-Hans"),
SupportedCultures = SupportedCultures,
SupportedUICultures = SupportedCultures,
};
app.UseRequestLocalization(options);
var requestProvider = new RouteDataRequestCultureProvider();
options.RequestCultureProviders.Insert(0, requestProvider);
app.UseStaticFiles();
app.UseStatusCodePagesWithReExecute("/StatusCode/{0}");
app.UseRouting();
app.UseAuthorization();
app.UseSession();
app.UseRouter(routes =>
{
routes.MapMiddlewareRoute("{culture=zh-hans}/{*mvcRoute}", subApp =>
{
subApp.UseRequestLocalization(options);
subApp.UseRouting();
subApp.UseEndpoints(mvcRoutes =>
{
mvcRoutes.MapControllerRoute("default", "{culture=zh-hans}/{controller=Home}/{action=Index}");
mvcRoutes.MapControllerRoute("home.html", "{culture=zh-hans}/{controller=Home}/{action}.html");
});
});
});
}
}
А вот контроллер:
[HttpPost]
public async Task<IActionResult> abc(string i)
{
if (HttpContext.Session.GetInt32(i) == null)
{
HttpContext.Session.SetInt32(i, 1);
_logger.LogInformation("Session is :" + HttpContext.Session.GetInt32(i).ToString());
return Ok("First time.");
}
else
{
return Ok("Ran yet.");
}
return Ok(null);
}
Как видите, я выполнил проверку контроллера с помощью регистратора.Сеанс работает хорошо после установки и перед возвратом (не только на локальном, но и на сервере).
Однако, когда удаленный сервер отправляет запрос на сервер, сеанс всегда получает значение NULL.
Что не так с этим?