【问题标题】:I do not know what is wrong with initialization of cookies我不知道 cookie 的初始化有什么问题
【发布时间】:2022-01-24 11:01:39
【问题描述】:

感谢调试,我知道当我执行这部分代码时,我的键为“Cart”的 cookie 仍然为空。我不知道是什么问题,也许是配置。我使用 .NET 6.0,所以我没有 Startup.cs 文件。据我所知,我在互联网上做了所有教程,所以我知道它不起作用的原因是什么。我使用 ASP NET Core MVC。

if (Request.Cookies[strCart] == null)
            {
                List<Cart> lsCart = new List<Cart>();
                lsCart.Add(new Cart(_context.Articles.Find(id), 1));
                cartAmount++;
                CookieOptions option = new CookieOptions();
                option.Expires = DateTime.Now.AddDays(7);
                Response.Cookies.Append(strCart, JsonConvert.SerializeObject(lsCart), option);
                //Request.Cookies[strCart] is still null
            }

Program.cs 文件:

using Shop.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddMvc().AddSessionStateTempDataProvider();
builder.Services.AddSession();
builder.Services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddDbContext<MyDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});

builder.Services.ConfigureApplicationCookie(options =>
{
    // Cookie settings
    options.Cookie.Name = "Shop";
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
    options.Cookie.SameSite = SameSiteMode.Strict;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(1440);
    options.SlidingExpiration = true;
    options.LoginPath = "/Identity/Account/Login";
    options.AccessDeniedPath = "/Identity/Account/AccessDenied";
    options.SlidingExpiration = true;
});

var app = builder.Build();


if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseSession();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

【问题讨论】:

  • 如果在响应中添加cookie,这不会影响当前请求。您应该在浏览器的开发者工具 > 网络中检查响应,看看是否包含 cookie。然后检查它是否保存在您的浏览器中,然后检查即将到来的请求是否包含它。

标签: c# asp.net asp.net-mvc asp.net-core cookies


【解决方案1】:

从你提供的示例代码中,我测试了一下,发现没有问题。建议Request.Cookies[strCart]写成Request.Cookies["strCart"]更容易理解。

首先,我们需要明确一点,当我们请求赋值时,我们应该得到null。

当当前请求结束时,我们可以从下面的 gif 图片中看到,cookie 的内容存储在浏览器中。设置好cookie后,再次触发请求,查看Request.Cookies["strCart"]中的值。

原因:


重现问题:

1.我的测试代码。

   public string test()
   {
        List<Cart> lsCart = new List<Cart>();
        int cartCount = 10;
        for (int i = 0; i < cartCount; i++)
        {
            Cart c = new Cart();
            c.Id = i;
            lsCart.Add(c);
        }
        CookieOptions option = new CookieOptions();
        option.Expires = DateTime.Now.AddDays(7);
        Response.Cookies.Append("strCart", JsonConvert.SerializeObject(lsCart), option);
        return string.Empty;
   }
   ...
   public class Cart { 
       public int Id { get; set; }
   }

2。测试结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2015-09-11
    • 1970-01-01
    • 2020-11-21
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多