用HttpCookie存放Language來實現多國語言,但在IE中能實現,在Firefox中卻無法實現。
詭異的現象一:怎么刪也刪不掉?
一開始用的方法是Remove方法,如下:
protected void ddlLng_SelectedIndexChanged(object sender, EventArgs e) { HttpCookie httpCookie = new HttpCookie(SessionKeys.CookieName); Response.Cookies.Remove(SessionKeys.CookieName); Response.Cookies.Add(httpCookie); httpCookie.Values.Add(SessionKeys.Language, ddlLng.SelectedValue); Response.Cookies[SessionKeys.CookieName].Expires = DateTime.Now.AddYears(1); Response.Redirect(Request.Url.PathAndQuery); }
但是這個Remove方法是不可靠的,這個操作在HttpCookieCollection這個集合里面刪除了cookie,當服務器將數據傳輸到客戶端的時候,不會包含這個已經在服務端刪除了的Cookie的任何信息,瀏覽器也就不會對它做任何改變(remove方法只是不讓服務器向客戶機發送那個被刪除的cookie,與此cookie留不留在客戶機里無關)。所以cookie刪除不掉的情況就出現。
而且在MSDN的刪除HttpCookie的示例上也沒有用該方法!於是嘗試着用MSDN的示例!
於是有了詭異的現象二:明明刪掉了,為什么還是顯示“zh-CN”呢???
用MSDN的示例,代碼如下
protected void ddlLng_SelectedIndexChanged(object sender, EventArgs e) { HttpCookie cookies = Request.Cookies[SessionKeys.CookieName]; if (cookies != null) { cookies.Expires = DateTime.Today.AddDays(-1); Response.Cookies.Add(cookies); Request.Cookies.Remove(SessionKeys.CookieName); } HttpCookie c = new HttpCookie(SessionKeys.CookieName); c.Values.Add(SessionKeys.Language, ddlLng.SelectedValue); c.Expires = DateTime.Now.AddYears(1); Response.Cookies.Add(c); Response.Redirect(Request.Url.PathAndQuery); }
明明刪掉后,並將Cookie的值賦為“en-US”,為什么還能讀到“zh-CN”呢?難道MSDN也靠不住了嗎???網上搜了很多,所有人都在用這個方法,那為什么我的不行呢?
幾經思索,突然想到這跟瀏覽器有關嗎?雖然安裝Firefox會將IE的Cookie一並帶過來,但IE的Cookie和Firefox的Cookie會不會有問題?會不會我刪的是Firefox的Cookie,接着讀的是IE的Cookie? 想到這,立馬把兩個瀏覽器的Cookie刪除,並將Firefox的“Accept third-part cookies”(Tools->Options->Privacy->Firefox will->select 'Use custom settings for history'->Accept third-part cookies)去掉。再試,成功!看來果然是兩處的Cookie混亂了!