为来自另一个域的每个请求创建会话

时间:2018-04-06 10:57:37

标签: c# angular session asp.net-core cart

我使用ASP.NET Core Web API 2.0和Angular 5.

我需要使用购物车的会话。当我从swagger发送请求时,服务器对所有请求使用一个会话,当我从Angular(不同域)发送请求时,服务器在每个请求上创建新会话。

我使用CORS:

services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
        {
            builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowCredentials()
                .SetIsOriginAllowedToAllowWildcardSubdomains()
                .AllowAnyHeader();
        }));

并将其添加到CartController上方

[EnableCors("MyPolicy")]

我也初始化会话

app.Run(async (context) =>
        {
            if (!context.Session.Keys.Contains("Cart"))
            {
                context.Session.Set<Cart>("Cart", new Cart());
            }
            else
            {
                context.Session.Get<Cart>("Cart");
            }
        });

并添加了服务

        services.AddRouting();
        services.AddScoped(SessionCart.GetCart);
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddMvc().AddSessionStateTempDataProvider();
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            options.Cookie.HttpOnly = true;
            options.Cookie.SecurePolicy = CookieSecurePolicy.None;
        });

SessionCart

        public static Cart GetCart(IServiceProvider services)
    {
        ISession session = ServiceProviderServiceExtensions.GetRequiredService<IHttpContextAccessor>(services)?.HttpContext.Session;
        SessionCart cart = session?.Get<SessionCart>("Cart") ?? new SessionCart();
        cart.Session = session;
        return cart;
    }

    public override void AddItem(DishModel product, int quantity)
    {
        base.AddItem(product, quantity);
        Session.Set("Cart", this);
    }

我如何解决问题?

1 个答案:

答案 0 :(得分:1)

API是无状态的,这意味着每个请求都是独立的。因此,在“会话”中,您无法在API端保留任何内容。

您希望以其他方式实现目标,具体解决方案取决于您的要求。

一种方法是在JavaScript端跟踪您的购物车,并使用API​​存储您需要的任何内容。您可以让用户添加/删除/执行他们想要的任何操作,当他们提交时,您可以一次性将购物车的内容发送到api。

我工作的一些系统需要跟踪购物车上的每个操作,报告物品/放弃率,这样的东西。如果是这种情况,那么您最初可以创建一个购物车,跟踪其从api /数据库返回的ID,然后在每次添加或删除某些内容时发出请求。购物车的ID用于跟踪数据,然后您不需要在会话中保留任何内容。

所以,根据你的要求选择你的毒药。