Я работаю с переменными Session. NET Core 3, когда я делаю асинхронный c запрос на проверку этих переменных (с angularjs), они превращаются в нулевые значения (для syn c запрос я могу получить эти значения).
Это мой setup.cs
public void ConfigureServices(IServiceCollection services)
{
string[] origins = new string[1] { "http://angularapp" };
services.AddCors(options =>
{
options.AddPolicy("AllowMyOrigin",
builder => builder.WithOrigins(origins)
.AllowAnyHeader()
.AllowCredentials());
});
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IClaimPrincipalManager, ClaimPrincipalManager>();
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.Cookie.IsEssential = true;
});
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseCors("AllowMyOrigin");
app.UseRouting();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Здесь я пытаюсь получить одно значение из сеанса
#region Private Fields
private readonly IHttpContextAccessor _httpContextAccessor;
private ISession _session => _httpContextAccessor.HttpContext.Session;
#endregion Private Fields
#region Public Constructors
public SecurityController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public async Task<IActionResult> IsSessionActive()
{
try
{
var user = await _session.Get<string>("User");
}
catch (Exception ex)
{
return this.StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
}
return Ok(true);
}
и вот мой асинхронный вызов (angularjs)
$http({
method: "POST",
url: BACKEND_URL,
withCredetial: true,
headers: [
{ 'Content-Type': 'application/json' }
]
}).then(function (response) {
console.log(response);
});
кстати, я использую метод session.LoadAsyn c () через реализацию это расширение
public static class SessionExtensions
{
public static async Task Set<T>(this ISession session, string key, T value)
{
if (!session.IsAvailable)
await session.LoadAsync();
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static async Task<T> Get<T>(this ISession session, string key)
{
if (!session.IsAvailable)
await session.LoadAsync();
var value = session.GetString(key);
return value == null ? default(T) :
JsonConvert.DeserializeObject<T>(value);
}
}