为什么HttpContext.Response.Cookies [“foo”]添加一个cookie?

时间:2011-12-13 14:44:43

标签: asp.net

由于以下行为,我花了半天时间追踪错误: -

想象一下,在Http请求或响应的cookie集合中,有一个名为“foo”的 cookie。以下代码返回null

A) HttpContext.Current.Request.Cookies["foo"]

以下代码创建一个名为“foo”的新cookie(带有path =“/”和空白值),将其添加到响应的cookie集合中并返回

B) HttpContext.Current.Response.Cookies["foo"]

所以(B)的副作用是在客户端的浏览器上覆盖任何预先存在的名为“foo”的cookie。

这不是错误。有人故意对此进行编码。这是Get方法的反汇编(Item [string name] indexer委托给这个方法。

    public HttpCookie Get(String name) {
        HttpCookie cookie = (HttpCookie)BaseGet(name); 

        if (cookie == null && _response != null) { 
            // response cookies are created on demand 
            cookie = new HttpCookie(name);
            AddCookie(cookie, true); 
            _response.OnCookieAdd(cookie);
        }

        return cookie; 
    }

显然,MSDN文档没有提到这种行为(尽管有些用户在描述此行为的文档底部添加了注释)。

我的问题是,有人可以向我解释HttpCookieCollection类有这种行为的理由。

2 个答案:

答案 0 :(得分:2)

来自MSDN doc的HttpCookieCollection.Get方法:http://msdn.microsoft.com/en-us/library/ezy11xy2.aspx

  

如果指定的cookie不存在,则此方法会创建一个新cookie   用那个名字。

所以是的,这是故意的。

答案 1 :(得分:1)

为什么呢?猜测,因为它是有道理的。如果您对响应做了任何事情,那么典型的用例就是您希望将内容发送到浏览器。

检查入站值(Request.Cookies),然后将它们设置为出站(Response.Cookies)。请求是READ,响应是WRITE。