环境:
WIN7 IIS7
.NET 4.0
伪静态生成COOKIES代码:
 /// <summary>
        /// 设置COOKIES,包括值,做用域,有效路径,过期时间,字全级别
        /// </summary>
        /// <param name="Cookie">COOKIES集合名称</param>
        /// <param name="CookieItem">集合中元素名表,KEY为元素名,值为元素值</param>
        public void SetCookies(string Cookie, Hashtable CookieItem)
        {
            HttpCookie Cookeis = new HttpCookie(Cookie);
            foreach (DictionaryEntry de in CookieItem)
            {
                Cookeis[de.Key.ToString()] = HttpContext.Current.Server.UrlEncode(de.Value.ToString());
            }
            HttpContext.Current.Response.Cookies.Add(Cookeis);
        }获取COOKIE
public object GetCookies(string cookies, string items)
        {
            HttpCookie cookie = HttpContext.Current.Request.Cookies[cookies];
            if (cookie != null)
                return HttpContext.Current.Server.UrlDecode(cookie.Values[items]);
            return null;
        }清除COOKIES (Request已试过) public void RemoveCookies(string Cookie)
        {
            HttpContext.Current.Response.Cookies[Cookie].Values.Clear();
            HttpContext.Current.Response.Cookies[Cookie].Expires = DateTime.Now.AddDays(-1000);
            HttpContext.Current.Response.Cookies.Remove(Cookie);
        }
问题:调用上面生成COOKIE的方法可以正常生成COOKIES
调用获取COOKIES的方法可以得到COOKIE
但是::
调用清除COOKIES的方法无法删除COOKIE
请教:如何才可能清除当前指定的COOKIES。
注:以前可以用,但是现在出现了问题,请问这个还会在哪里引起这样的错误?!

解决方案 »

  1.   

    你监视cookies的值. 之后一步一步调试就出结果了.
      

  2.   

    向浏览器写一个过期的Cookie就可以删除了,试下面的代码:
    public void RemoveCookies(string name)
      {
    HttpCookie cookie = new HttpCookie(name);
    cookie.Expires = DateTime.Now.AddDays(-1000);
    HttpContext.Current.Response.AppendCookie(Cookie);
      }
      

  3.   

    Cookie是服务器与浏览器之间传道的信息,如果只是在服务器简单的调用Clear()或Remove()的话,只是修改了服务器端的Cookie,但是并不会影响浏览器的Cookie值,所以当下次浏览器再提交时,又重现了。
      

  4.   


    说明清楚cookies的代码没问题, 可以去其他地方找问题了.
      

  5.   

    在设置cookies的地方加上断点. 之后调试.
      

  6.   


     HttpCookie cookie=....;              
            cookie.Expires = DateTime.Now.AddDays(-1);
            Response.Cookies.Add(cookie);     //这步不要忘了
      

  7.   

    这是我清除cookie的代码:            HttpCookie cook = Request.Cookies["username"];
                cook.Expires = DateTime.Now.AddDays(-1);
                cook.Values.Clear();
                System.Web.HttpContext.Current.Response.Cookies.Set(cook);注意最后一句
      

  8.   

      Response.Cookies.Add(cookie);     //这步不要忘了
    这一步是需要的吧
      

  9.   

          HttpCookie cook = Request.Cookies["username"];
                cook.Expires = DateTime.Now.AddDays(-1);
                cook.Values.Clear();
                System.Web.HttpContext.Current.Response.Cookies.Set(cook);
      

  10.   

     public void RemoveCookies(string Cookie)
      {
      HttpContext.Current.Response.Cookies[Cookie].Values.Clear();
      HttpContext.Current.Response.Cookies[Cookie].Expires = DateTime.Now.AddDays(-1000);
      HttpContext.Current.Response.Cookies.Remove(Cookie);
      }Cookie存在于客户端是无法直接删除的,只能通过设置一个过期时间让它失效,然后通过浏览器的机制进行删除,楼主下面的写法其实并没有将Cookie的过期时间重写到客户端。可以用如下方法试试: public void RemoveCookies(string Cookie)
      {
      HttpContext.Current.Response.Cookies[Cookie].Values.Clear();
      HttpContext.Current.Response.Cookies[Cookie].Expires = DateTime.Now.AddDays(-1000);//设置过期时间
      HttpContext.Current.Response.Cookies.Add(Cookeis);//覆盖cookie

      }
      

  11.   

    有点乱,重新写一下。楼主存在的问题就是没有重新将客户端的Cookie给覆盖掉
    原来的:
     public void RemoveCookies(string Cookie)
      {
      HttpContext.Current.Response.Cookies[Cookie].Values.Clear();
      HttpContext.Current.Response.Cookies[Cookie].Expires = DateTime.Now.AddDays(-1000);
      HttpContext.Current.Response.Cookies.Remove(Cookie);
      }
    重写成如下        HttpCookie curCookie = Request.Cookies[Cookie];
            curCookie.Expires = DateTime.Now.AddDays(-1);
            Response.Cookies.Add(curCookie);
      

  12.   


    这种方法早已经试过.
    刚才我又断点看了一下,在清除COOKIE的时候,可以获取COOKIE内容,但是设置过期后,以及从从集合中移除都不起作用,即使设置了过期,再看COOKIES的时候,根本没有什么变化.不过COOKIE的过期日期竟然是0001/01/01也就是看上去清除的COOKIE和获取到的竟不是同一个,是呼这个COOKIE被什么东西给隔离了
      

  13.   

    先把Cookie的值改为空
    把Cookie的过期时间写成负的,浏览器会自动删除的
      

  14.   

    Cookie使用不正确,请参考MSDN上面使用Cookie方法
      

  15.   

    刚才我又断点看了一下,在清除COOKIE的时候,可以获取COOKIE内容,但是设置过期后,以及从从集合中移除都不起作用,即使设置了过期,再看COOKIES的时候,根本没有什么变化.不过COOKIE的过期日期竟然是0001/01/01
    -------------------------
    从楼主的这句话,就可以推定楼主在使用Cookie时存在误区,像下面的代码,会自动创建Cookie的:
    HttpCookie cookie = Response.Cookies["Cookie"];它会创建一个过期时间是0001-1-1 0:00:00。楼主读Cookie的时候,应该从Request.Cookies中获取,Response.Cookies是发送给客户端的。
      

  16.   

    改进下之前提供的代码:
    public void RemoveCookies(string name)
      {
    HttpContext.Current.Request.Cookies.Remove(name);HttpCookie cookie = new HttpCookie(name);
    cookie.Expires = DateTime.Now.AddDays(-1000);
    HttpContext.Current.Response.AppendCookie(Cookie);
      }
      

  17.   


    几天过去了,问题依旧.
    如果说COOKIE使用不正确,请问您写一个正确的出来,不要说MSDN,那上面的要是能使用通过我就不来问了!
      

  18.   

    1.设置Cookie
      1Cookie cookie = new Cookie("key", "value");
      2cookie.setMaxAge(60); //设置60秒生存期,假如设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。
      3cookie.setPath("/test/test2"); //设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.XML里配置的该Servlet的url-pattern路径部分)
      4response.addCookie(cookie);
      2.读取Cookie
      11//该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,假如没有任何Cookie的话,则返回null
      22Cookie[] cookies = request.getCookies();
      3.删除Cookie
      1Cookie cookie = new Cookie("key", null);
      2cookie.setMaxAge(0); //设置为0为立即删除该Cookie
      3cookie.setPath("/test/test2"); //删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie
      4response.addCookie(cookie);
      4.注重:假设路径结构如下
      /
      /test
      /test/test2
      /test345
      /test555/test666
      a.相同键名的Cookie(值可以相同或不同)可以存在于不同的路径下。
      b. 删除时,假如当前路径下没有键为"key"的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie)
      FF.必须指定与设定cookie时使用的相同路径来删除改cookie,而且cookie的键名不论大写、小写或大小混合都要指定路径。
      IE.键名小写时,假如当前路径为/test/test2,假如找不到再向上查询/test、/test555、/test345,假如还找不到就查询/ 。(/test555/test666不查询)
      键名大小写混合或大写时,不指定路径则默认删除当前路径,并且不向上查询。
      c.读取Cookie时只能读取直接父路径的Cookie。
      假如当前路径为/test/test2,要读取的键为"key"。当前路径读取后,还要读取/test,/test读取后,还要读取/
      d.在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来治理不同的Web Application,这样对于每个Context有不同的Path,
      在一个Server中有多个Web Application时要非凡小心,不要设置Path为/的Cookie,轻易误操作。(当然前提是域名相同)
      

  19.   

    //注销Cookie
                HttpCookie myCookie = Request.Cookies["CNLClubOperatorRoles"];
                if (myCookie != null || myCookie.Value != "")
                {
                    
                    myCookie.Value = null;
                    Response.Cookies.Add(myCookie);
                }
    你可以把Cookie设为null值
    也可以
    HttpCookie myCookie = Request.Cookies["CNLClubOperatorRoles"];
                if (myCookie != null || myCookie.Value != "")
                {
                    myCookie.Expires = DateTime.Now.AddDays(-31);
                    Response.Cookies.Add(myCookie);
                }
    把Cookie设置过期时间