2013-04-08 171 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; 
}