Сессия изменена в Webhook - PullRequest
       34

Сессия изменена в Webhook

0 голосов
/ 07 апреля 2020

Я создаю интернет-магазин с использованием Stripe и. Net, и у меня возникают некоторые проблемы с сеансом, который не сохраняется в моем веб-крючке, и в результате веб-крючок не может получить корзину или информацию о клиенте.

Мой метод добавления в корзину выглядит следующим образом:

            var cartList = new List<CartProduct>();

            var stringObj = _session.GetString("cart");

            /* Logic for deserializing stringObj into List<CartProduct> */

            stringObj = JsonConvert.SerializeObject(cartList);

            _session.SetString("cart", stringObj);

Если я смотрю на _session, я вижу, что у него есть идентификатор. Тем не менее, когда я пытаюсь получить корзину из своего веб-крючка, идентификатор сеанса изменился, и в результате корзина становится пустой.

Мой метод get cart запускается на charge.succeeded с использованием веб-крючка и запускается примерно так :

            var cart = _session.GetString("cart"); // Returns null because session has changed

            var cartList = JsonConvert.DeserializeObject<List<CartProduct>>(cart); // Exception thrown due to cart being null

Я пытался сделать повара ie обязательным и установить CheckConsentNeeded в false. Это мой метод ConfigureServices файла startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddMvc(option => option.EnableEndpointRouting = false);
            services.AddSession(options => { 
                options.Cookie.Name = "cart";
                options.Cookie.MaxAge = TimeSpan.FromDays(365);
                options.Cookie.IsEssential = true; // make the session cookie Essential
            });
            services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["DefaultConnection"], b => b.MigrationsAssembly("ShopTutorial.Database")));

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
        }

app.UseSession (); был добавлен в метод Configure того же класса.

1 Ответ

0 голосов
/ 09 апреля 2020

Я решил это, добавив информацию о корзине в MemoryCache на 60 секунд с описанием способа платежа Stripe (новый GUID) в качестве ключа:

        var intent = new CreatePaymentIntent();

        ObjectCache cache = MemoryCache.Default;

        cache.AddOrGetExisting(intent.Description, Cart, new CacheItemPolicy {
            AbsoluteExpiration =
                DateTimeOffset.Now.AddSeconds(60.0)
        });

Затем в веб-крюке я назвал тот же кеш с указанным ключом c, который хранится в описании объекта намерения, отправленного обратно из Stripe:

        var charge = stripeEvent.Data.Object as Stripe.Charge;

        ObjectCache cache = MemoryCache.Default;

        var cart = (Cart)cache.Get(charge.Description);
...