2013-04-08 172 views
24

也有一些不同的方式在ASP.NET创建多值饼干:区别:setCookie方法,AppendCookie,Cookies.Add

var cookie = new HttpCookie("MyCookie"); 
cookie["Information 1"] = "value 1"; 
cookie["Information 2"] = "value 2"; 

// first way 
Response.Cookies.Add(cookie); 

// second way 
Response.AppendCookie(cookie); 

// third way 
Response.SetCookie(cookie); 

什么时候应该使用哪种方式?我读过SetCookie方法更新cookie,如果它已经退出。其他方式不更新现有的cookie吗?

并且是编写单值cookie的以下代码最佳实践吗?

Response.Cookies["MyCookie"].Value = "value";

回答

14

什么时候应该用哪种方式?

这取决于你想要做什么Cookie操作。

注意AddAppendCookie都在做相同的功能,除了一个事实,即与AppendCookie你没有引用的ResponseclassCookies财产,它这样做是为了你。

  • Response.Cookies.Add - 添加指定的cookie到cookie 集合。
  • Response.AppendCookie - 添加一个HTTP cookie的 内在 Cookie集合
  • Response.SetCookie - 更新现有饼干饼干 收藏。

Exceptions在添加重复cookie或试图更新不存在的cookie时不会引发。

的这些方法的主要exception是:HttpException(HTTP标头已被发送后一个cookie被附加。)

Add方法允许Cookie集合式两份饼干。使用Set方法确保cookie集合中的cookie的唯一性。

感谢MSDN

+2

'SetCookie'更新现有cookie:这是否意味着如果cookie不存在,将会有异常或cookie不会被设置?如果已经有一个同名的cookie,其他方法是不是更新cookie? – 2013-04-08 22:42:42

+0

@FelixC看看我的更新。 – 2013-04-08 22:59:50

+1

好的,谢谢你解释..但是我不明白何时使用任何其他方法作为Response.SetCookie - 因为这是编写独特cookie的最安全的方法。 – 2013-04-08 23:01:35

24

如果我没有记错都

Response.Cookies.Add(..) 

Response.AppendCookie(..) 

将允许同名的多个Cookie追加到响应。

在另一方面

Response.SetCookie(..) 

Response.Cookies[key].Value = value; 

将始终覆盖同名以前的饼干。

+5

这个答案更清晰,更重要的一点。 – Oliver 2013-11-19 16:00:19

+10

另外值得指出的是对于这两个['AppendCookie'](http://msdn.microsoft.com/en-us/library/system.web.httpresponse.appendcookie)和[ 'SetCookie'](http://msdn.microsoft.com/en-us/library/system.web.httpresponse.setcookie):*“此API支持.NET Framework基础结构,不能直接从您的代码“。* – tne 2014-06-20 08:21:40

+0

另一种方法是使用'System.Web.HttpCookieCollection.Set(HttpCookie cookie)'和'System.Web.HttpCookieCollection.Add(HttpCookie cookie)'例如'Response.Cookies.Set(新的HttpCookie(“cookieName”))'。 – 2018-01-19 17:37:12

5

要搭载tne's评论在Wiktor的回复中,AppendCookieSetCookie不应该被使用 - 它们是由.NET框架内部使用的。他们不应该公开,但他们是,我的猜测将作为IIS管道的其他地方的黑客攻击。

所以,你应该做你的Cookie设置这种方式(或写设置多个Cookie的扩展方法):

string cookieName = "SomeCookie"; 
string cookieValue = "2017"; 

if (Response.Cookies[cookieName] == null) 
{ 
    Response.Cookies.Add(new HttpCookie(cookieName, cookieValue)); 
} 
else 
{ 
    Response.Cookies[cookieName].Value = cookieValue; 
}