为什么 HttpContext.Response.Cookies[ "foo" ] 会添加 Cookie?



我刚刚花了半天的时间跟踪一个bug,由于以下行为:-

假设在Http请求或响应的cookie集合中有而不是一个名为"foo"的cookie。下面的代码返回null

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

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

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

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

这不是一个bug。实际上有人故意编写了这个代码。下面是Get方法的反汇编(Item[string name]索引器委托给该方法)。

    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类有这种行为的原因吗?

来自MSDN文档关于HttpCookieCollection。获取方法:http://msdn.microsoft.com/en-us/library/ezy11xy2.aspx

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

是的,这是故意的

为什么?只是猜测,因为这样说得通。如果您正在对响应做任何事情,典型的用例是您希望将内容发送到浏览器。

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

最新更新