C# 在内容页之间遍历时,cookie值消失

C# 在内容页之间遍历时,cookie值消失,c#,asp.net,cookies,C#,Asp.net,Cookies,在我的应用程序中。有一种登录机制,它使用刚刚登录的用户的信息保存cookie private void CreateCookie(LoginEventArgs args) { HttpCookie cookie = new HttpCookie("user"); cookie.Values["name"] = args.User_Name; cookie.Values["id"] = args.ID; c

在我的应用程序中。有一种登录机制,它使用刚刚登录的用户的信息保存cookie

     private void CreateCookie(LoginEventArgs args)
     {
         HttpCookie cookie = new HttpCookie("user");
         cookie.Values["name"] = args.User_Name;
         cookie.Values["id"] = args.ID;
         cookie.Expires = DateTime.Now.AddDays(1);            
         Response.Cookies.Add(cookie);
     }
在母版页加载时,我执行检查以查看此cookie是否存在:

   HttpCookie cookie = Request.Cookies["user"] ;
   if( (cookie != null) && (cookie.Value != ""))  
   {
        if (Session["user"] == null)
            Login_Passed(this, new LoginEventArgs(cookie.Values["name"].ToString(), int.Parse(cookie.Values["id"])));
   }
现在,如果我登录(创建cookie),请关闭浏览器并运行我的应用程序。又是饼干 存在它的值是正确的,并且用户“自动”登录

如果我首先从启动内容页重定向到其他内容页 cookies值也完好无损

问题是当我再次重定向回另一个内容页时, 母版页加载,进行检查 cookie存在,但值已删除

你知道为什么会这样吗

顺便说一句,我的注销方式可能是导致此问题的原因:

当我注销时,我创建了一个与1天前过期的cookie同名的cookie

   private void Remove_Cookie()
   {
        HttpCookie cookie = new HttpCookie("user");
        cookie.Expires = DateTime.Now.AddDays(-1);
        Response.Cookies.Add(cookie); 
   }
在iv'e描述的情况下,我没有正式注销,我只是结束了我的应用程序,所以这不应该发生 没有任何影响

尝试以下操作:

  • 如果你是在本地机器上开发的,请将你的应用程序放在一些免费网页上,这样就不会有“特殊待遇”,因为你在本地主机上
  • 如果您已经在一个web服务器上,并且重定向在两个不同的域之间,那么您可能希望在google中搜索“同源策略”或阅读以下内容:(该文档涉及javascript,但对于Cookie也是如此)

    • 好的,这个问题是不可想象的
      特别感谢彼得·布朗伯格

      在文章的“消失的饼干”部分

      作者声明,如果您有手表,请点击Response.Cookies[“cookie\u name”] 浏览器将创建一个新的空cookie,该cookie将覆盖您的cookie

      我用了这样一块手表,它使我的饼干失去了它的价值,当我把它拿下来时,饼干保持了它的价值

      这句话的寓意是不要看别人的反应 我也在其他帖子上读到如果你查一下

       if( Response.Cookies["cookie_name"] != null    )  
      

      例如,它也会被覆盖

      要重申并建立在已经陈述的基础上(是的,我知道这是一个4年前的问题),我发现最好建立一个实用程序来处理这个问题——主要是因为我想经常检查特定的cookie

      这将不涉及响应,而仅从请求中读取

          public static HttpCookie GetCookie(string cookieName)
          {
              HttpCookie rqstCookie = HttpContext.Current.Request.Cookies.Get(cookieName);
              /*** NOTE: it will not be on the Response!
               *   this will trigger the error noted in the original question and
               *   create a new, empty cookie which overrides it
               *   
                  HttpCookie respCookie = HttpContext.Current.Response.Cookies.Get(cookieName);
               * 
               */
              if (rqstCookie != null && !String.IsNullOrEmpty(rqstCookie.Value))
              {
                  // is found on the Request
                  return rqstCookie;
              }
              else
              {
                  return null;
              }
          }
      
      经验法则 始终读取请求并写入响应


      谢谢你,埃兰!这篇文章正是我所需要的

      使用以下方法从cookies中获取价值:

      public string GetValueFromCookies(HttpCookieCollection cookies)
      {
          if (cookies == null)
          {
              throw new ArgumentNullException(nameof(cookies));
          }
      
          // check the existence of key in the list first
          if (Array.IndexOf(cookies.AllKeys, key) < 0)
          {
              return null;
          }
      
          // because the following line adds a cookie with empty value if it's not there
          return cookies[key].Value;
      }
      
      公共字符串GetValueFromCookies(HttpCookieCollection cookies)
      {
      如果(cookies==null)
      {
      抛出新的ArgumentNullException(nameof(cookies));
      }
      //首先检查列表中是否存在密钥
      if(Array.IndexOf(cookies.AllKeys,key)<0)
      {
      返回null;
      }
      //因为下面的一行添加了一个cookie,如果它不存在,那么它的值为空
      返回cookies[key].值;
      }
      
      您是否在开发人员IIS上测试此功能?我甚至不知道这是什么。这就是在Visual Studio中调试时运行的IIS服务器。因为默认情况下,它会向该服务器添加一个随机端口,而您的cookie可能依赖于该localhost:port地址,请尝试在web项目中设置一个固定端口。问题仍然存在。我认为问题在于,当我再次重定向时,会执行另一个请求,并删除最后一个请求的cookie,你知道如何在请求之间保存cookies吗?不必在母版页的每个页面上重新创建cookie。我正在本地机器上工作,请原谅我的无知,但你所说的“免费网页”是什么意思?我的意思是,你不必为托管付费。因为在开发过程中支付网络主机费是一种浪费。(不幸的是,我不知道在哪里可以找到)你可以尝试的另一件事是使用不同的浏览器。问题是cookie是否在请求之间保持活动状态,当我再次重定向它时,它是一个不同的请求,但cookie仍然存储在我的机器上,因此即使有另一个请求,它也应该被再次发送,我会在另一个浏览器上试用,让你知道不同浏览器的相同问题a getter有副作用吗?嗯,据我所知,我检查了几次只是为了确定。哥们,这太疯狂了。我快发疯了!谢谢吉米吃玉米。那太疯狂了,非常有用!适用于任何使用C#6.0以后版本的用户。下面的行可以使用,而不是整个if/else语句<代码>返回!string.IsNullOrEmpty(rqstCookie?.Value)?rqstCookie:null