Asp.net mvc 失铬饼干

Asp.net mvc 失铬饼干,asp.net-mvc,google-chrome,cookies,Asp.net Mvc,Google Chrome,Cookies,我在我的实时站点上遇到了一个错误,我在我的开发环境中没有看到这个错误,而且这似乎只发生在Chrome上。我已经四处寻找了一些解决方案,我发现只有Auth cookie存在问题。(事实上,我在过去提出了一个关于chrome和auth cookie的问题),但这是不同的 我将用户购物车存储在cookie中。我把曲奇饼放成这样 HttpCookie responseCookie = HttpContext.Response.Cookies[CartHelper.CART]; responseCooki

我在我的实时站点上遇到了一个错误,我在我的开发环境中没有看到这个错误,而且这似乎只发生在Chrome上。我已经四处寻找了一些解决方案,我发现只有Auth cookie存在问题。(事实上,我在过去提出了一个关于chrome和auth cookie的问题),但这是不同的

我将用户购物车存储在cookie中。我把曲奇饼放成这样

HttpCookie responseCookie = HttpContext.Response.Cookies[CartHelper.CART];
responseCookie.PackCartCookie(vm.Cart);
其中扩展方法PackCartCookie设置cookie值,如下所示

cookie.Value = HttpUtility.UrlEncode(cookieValue);
此结果是使用以下设置存储的cookie

  • 域名=www.foo.com
  • 原始尺寸=230b
  • 路径=/
  • 过期=会话
  • HttpOnly=HttpOnly
  • 值=加密
当用户与站点交互时,似乎正在创建购物车Cookie,但它会不时丢失或丢弃。当我查看Elmah错误并查看HTTP_COOKIE时,我可以看到所有其他COOKIE(我以相同的方式设置了其他COOKIE,其功能很好),但我没有看到cart COOKIE

由于这个问题,我不得不修改代码,使其更具防御性。但是,正如您可以想象的那样,购物车cookie在整个购买过程中都被使用,我在响应购买时失败,我接受付款,但系统崩溃,因为购物车消失了,用户没有收到成功购买的通知。幸运的是,我很早就发现了这一点,并向受影响的用户退款

我看到问题所在的用户代理

  • Mozilla/5.0(X11;Linux i686)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/29.0.1547.62 Safari/537.36
  • Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/29.0.1547.57 Safari/537.36
  • Mozilla/5.0(Windows NT 6.0)AppleWebKit/537.36(KHTML,如Gecko)Chrome/29.0.1547.62 Safari/537.36

    • 让我给你一个解决方案。我使用cookies来存储这里的大多数值,并且在所有浏览器中都能正常工作,并且存储在所提到的特定时间。为此,我使用静态类在任何地方都可以访问

      我在这里也进行了编码和解码。但是,您可以通过删除编码和解码并传递正常值来存储它。这是我的密码

      在这里,我将我的类与静态方法放在一起。我使用了
      HttpSecureCode
      ,使用机器密钥加密进行编码和解码。在这种情况下,默认情况下可能不可用。您可以直接输入值

      如果您对使用
      HttpSecureCode
      非常挑剔,那么可以使用它来构建您的类

      public class CookieStore
      {
          public static void SetCookie(string key, string value, TimeSpan expires)
          {
              HttpCookie encodedCookie = HttpSecureCookie.Encode(new HttpCookie(key, value));
      
              if (HttpContext.Current.Request.Cookies[key] != null)
              {
                  var cookieOld = HttpContext.Current.Request.Cookies[key];
                  cookieOld.Expires = DateTime.Now.Add(expires);
                  cookieOld.Value = encodedCookie.Value;
                  HttpContext.Current.Response.Cookies.Add(cookieOld);
              }
              else
              {
                  encodedCookie.Expires = DateTime.Now.Add(expires);
                  HttpContext.Current.Response.Cookies.Add(encodedCookie);
              }
           }
          public static string GetCookie(string key)
          {
              string value = string.Empty;
              HttpCookie cookie = HttpContext.Current.Request.Cookies[key];
      
              if (cookie != null)
              {
                  // For security purpose, we need to encrypt the value.
                  HttpCookie decodedCookie = HttpSecureCookie.Decode(cookie);
                  value = decodedCookie.Value;
              }
              return value;
          }
      
      }
      
      使用这些,您可以轻松地将值存储在cookie中,并在需要时获取值

      使用这些方法非常简单

      用于设置Cookie:

      CookieStore.SetCookie("currency", "GBP", TimeSpan.FromDays(1)); // here 1 is no of days for cookie to live
      
      string currency= CookieStore.GetCookie("currency");
      
      用于获取Cookie:

      CookieStore.SetCookie("currency", "GBP", TimeSpan.FromDays(1)); // here 1 is no of days for cookie to live
      
      string currency= CookieStore.GetCookie("currency");
      

      cookie仅用于会话,您是否重定向到其他站点或服务以处理付款?如果是这样的话,会话将死亡,因此cookie将消失……我没有重定向,但我在一个iFrame中托管了一个支付门户,它将调用该站点。但是为什么我的其他会话cookie能够存活而这个不能存活?你的其他cookie的大小是多少?在chrome上,我认为总大小只能是4k。我不确定cookie是否是存储用户购物车的最佳方式,ASP.Net还有其他方法,例如会话。这不是cookie的大小,加上我所有的cookie都不能构成1k。我注意到Chrome有时会制作我的两个会话cookie。每个都有不同的域(我不是通过代码设置域,这可能是问题所在)。一个域名是www.mysite.com,另一个域名是just.mysite.com。问题可能出在我的cookie域值上吗?是的,听起来很像