我使用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);
}
我如何解决问题?
答案 0 :(得分:1)
API是无状态的,这意味着每个请求都是独立的。因此,在“会话”中,您无法在API端保留任何内容。
您希望以其他方式实现目标,具体解决方案取决于您的要求。
一种方法是在JavaScript端跟踪您的购物车,并使用API存储您需要的任何内容。您可以让用户添加/删除/执行他们想要的任何操作,当他们提交时,您可以一次性将购物车的内容发送到api。
我工作的一些系统需要跟踪购物车上的每个操作,报告物品/放弃率,这样的东西。如果是这种情况,那么您最初可以创建一个购物车,跟踪其从api /数据库返回的ID,然后在每次添加或删除某些内容时发出请求。购物车的ID用于跟踪数据,然后您不需要在会话中保留任何内容。
所以,根据你的要求选择你的毒药。