2012-01-23 89 views
8

我試着用C#4.0中做一個永久性的Cookie和驗證碼:餅乾過期不工作在C#

HttpCookie AssoCookie = new HttpCookie("AssociateCode", AssociateCode); 
AssoCookie.Expires = DateTime.Now.AddMonths(6); 
HttpContext.Current.Response.Cookies.Add(AssoCookie); 

不幸的是,它不工作,且Cookie會話過期。如果我使用Web開發的插件在Firefox來檢查它,我可以看到這個信息:

Name AssociateCode 
Value test 
Host localhost 
Path /
Secure No 
Expires At End Of Session 

的餅乾,我做的是它只是在那裏創建了一個測試,沒有人否則將對其進行管理或編輯它,所以它不能覆蓋。我沒有在webconfig中設置cookie設置過期(無論如何這應該重寫),如果我設置了一些cookie過期時間,它不起作用。

我現在有點迷路了,每一個手冊,教程,博客,無論我檢查說,你只需要設置過期日期,我已調試,我檢查它創建時真的有這個值, Page_PreRender,但無論我做什麼,它都會隨着會話過期。

任何想法?

即時通訊使用Firefox 9.0.1順便說一句。

更新

在Firefox用Firebug插件來檢查響應頭,我得到這樣的:

Response Headersview source 
Cache-Control private 
Connection Close 
Content-Length 21322 
Content-Type text/html; charset=utf-8 
Date Mon, 23 Jan 2012 16:47:08 GMT 
Server ASP.NET Development Server/10.0.0.0 
Set-Cookie AssociateCode=test; expires=Mon, 23-Jul-2012 16:09:04 GMT; path=/ 
X-AspNet-Version 4.0.30319 

而且使用招我得到這個:

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
Set-Cookie: AssociateCode=; expires=Mon, 23-Jul-2012 16:27:29 GMT; path=/ 
X-Powered-By: ASP.NET 
Date: Mon, 23 Jan 2012 17:27:29 GMT 
Content-Length: 21313 

**更新2 * * 我檢查Cookie不存在只是檢查我的Firefox的Cookie,但如果你想看看如何我明白了在後面的代碼(不是必須的,因爲它不是在那裏反正):

try { 
    AssociateCode = HttpContext.Current.Request.Cookies.Get("AssociateCode").Value; 
} catch { } 
+0

您確定cookie本身即將過期,還是由於會話的行爲方式似乎過期?調試期間會話過期後,Cookie是否實際上不再附加到請求? –

+0

如果我關閉瀏覽器窗口並再次打開,cookie就會消失。這種情況發生時不需要向頁面提出任何要求。所以它的截止日期確實是「會話結束」。 –

+0

我測試過了,沒有問題。瀏覽器在關閉它並重新打開它之後還記得這個cookie。我建議使用Fiddler來仔細檢查cookie是否真的被髮送到瀏覽器並帶有正確的過期標題,並且瀏覽器在關閉/重新打開後正確地將其發送回網站。 – MerickOWA

回答

3

大家好。我非常抱歉,由於某種原因,我似乎因爲某些原因在我關閉窗口時配置了瀏覽器,以便刪除cookie,因此,儘管Cookies正在正確創建,但瀏覽器將它們設置爲會話Cookie並非因爲它們僅僅是因爲瀏覽器選項。事實上,如果我去管理Firefox中的Cookie,我可以在cookie中取消選中「Session Cookie」選項,然後過期日期是正確的,但由於某種原因,默認情況下檢查選項被選中。我認爲也許有一種方法可以設置Cookie是否爲會話Cookie,或者.Net在我意識到這一點之前做了某些事情。

嘛,沒事的時候邏輯似乎工作,你知道問題是你能想象的最愚蠢的事......

對不起一次。

+0

沒有問題,我有同樣的錯誤,現在我可以嘗試這些解決方案,謝謝 –

3

您是否嘗試過使用SetCookie函數,而不是添加?

HttpCookie cookie = new HttpCookie("test"); 
cookie.Expires = DateTime.Now.AddHours(10); 
HttpContext.Current.Response.SetCookie(cookie); 

剛剛測試過這個,它適用於我。

+0

不錯的嘗試,我檢查了它,並沒有工作。它必須是某種類型的IIS配置或丟失的東西。至少有人能證實我應該這樣做嗎?我開始懷疑它現在... –

+0

是的,這應該工作。你可以發佈HTTP響應(Set-Cookie頭),以便我們可以看到服務器正在發射什麼? –

+0

我已更新了標題的帖子。 –

6

只是爲了跟進我的評論:

從小提琴手和Firefox的工具的信息表明你在發送正確的信息來創建的cookie。

這使我相信你錯誤地測試了它的存在。

當測試cookie是否傳遞給您的應用程序時,您應該使用Request.Cookies容器來查看它是否在那裏。 (注意它是請求不是響應)。

如果你使用類似測試:

if (Response.Cookies["mycookie"] == null) { .. } 

,那麼這將導致響應對象的新cookie被創建的是空白的。

總結:Request對象將包含從瀏覽器發送的所有內容。 Response對象是您發送給瀏覽器的所有內容。

+0

是的,這是一個很好的提示,有時會發生。但我知道請求和響應之間的區別,事實並非如此。事實上,我只需要關閉並打開窗口,在Firefox的Cookies中搜索cookie並將其消失,或者使用Web Developer插件,它不存在。所以,我甚至不需要檢查它是否存在使用.Net,如果我這樣做,我使用請求,而不是當然。 ||例如:try {AssociateCode = Current.Request.Cookies.Get(「AssociateCode」)。Value; } catch {} –