Почему переменные сеанса равны нулю в асин c запросе? - PullRequest
0 голосов
/ 11 января 2020

Я работаю с переменными 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);
    }
}

1 Ответ

1 голос
/ 11 января 2020

TYPO:

$http({
  method: "POST",
  url: BACKEND_URL,
  ̶w̶i̶t̶h̶C̶r̶e̶d̶e̶t̶i̶a̶l̶:̶ ̶t̶r̶u̶e̶,̶
  withCredentials: true,
  headers: ̶[̶
    { 'Content-Type': 'application/json' }
  ̶]̶
}).then(function (response) {
  console.log(response);
});

Для получения дополнительной информации см.

...