2010-02-11 53 views
2

IE工作正常,但FireFox沒有。ASP.NET幫助! FireFox正在吃我的餅乾!

我設置一個cookie我Default.aspx頁面上:

HttpCookie hc = new HttpCookie("guid", guid.ToString()); 
    hc.Expires = DateTime.Parse("12/12/2010"); 
    Response.Cookies.Add(hc); 

我的上傳控件(我用的SWFUpload)提交給upload.aspx。

在upload.aspx我打電話:

if (Request.Cookies["guid"] != null) 
    { 
     // Do something. 
    } 

...我的cookie只包含我的ASP.NET會話變量。有任何想法嗎?

+2

讓我想起這條芝麻街角色...... – mjv 2010-02-11 14:45:34

+0

是Firefox阻止cookies嗎? http://www.wilderssecurity.com/showthread.php?t=246106 你使用Session嗎?它在Firefox中工作嗎? – Greg 2010-02-11 14:52:03

+1

OM NOM NOM? (對不起,不能幫助我自己) – Lucas 2010-02-11 15:52:05

回答

3

我試圖通過我的Flex應用程序在Firefox中上傳文件時遇到了同樣的問題。如果你也使用Flash,你可能想要做我所做的;如果您使用的是HTML控件,這可能適用,也可能不適用。

我爲解決Firefox問題所做的工作是在服務器上發出一次性使用令牌,然後在上傳時發佈該令牌(例如,它可能是表單中的隱藏字段)。如果令牌在上傳時被識別,則上傳被處理,然後令牌過期。所以基本上你在做什麼,只是不使用cookie。

+0

這就是我最終做的一個實現 - 我在頁面呈現之前向swfupload控件添加了一個參數。這種方式是在標題中,而不依賴於cookie /會話。好建議。謝謝。 – 2010-02-11 23:29:41

+0

所以這與Adobe有關,儘管最初的問題根本沒有提及它? – Greg 2010-02-17 15:27:42

+0

因爲我在通過Flash上​​傳時看到同樣的問題,所以我猜到了。我更新了這個問題,所以它提到了SWFUpload。 – Jacob 2010-02-17 16:15:02

0

首先,DateTime有一個類型安全的構造函數,它是new DateTime(2010, 12, 12)

其次,您使用的cookie的名稱不同:​​vs applicationGuid。不是兩者都可以使用。

+0

呃,應該是同一個名字 - 那不是問題。 – 2010-02-11 14:49:26

1

這是我用來添加/獲取cookie值。在IE和FF

對我的作品

的addCookie:

HttpCookie c = new HttpCookie("myCookie"); 
c.Expires = new DateTime(2050, 1, 1); 
c.Values.Add("key", "value"); 

的getCookie:

string value = Request.Cookies["myCookie"]["key"]; 
+0

downvote的原因? – David 2010-02-11 17:25:35

+0

+1,因爲我不同意-1。唯一可以補充的是「我們需要更多的信息來說明你的設置與此不同的原因」。 – Greg 2010-02-17 15:26:54

1

在幕後,你可能設置相同的cookie的兩倍。 Firefox和IE可能會有所不同,他們選擇保留哪一個。 ASP.NET喜歡在很多Web應用程序中自動設置一個「guid」cookie。通過選擇這個名字,你必然會在自動邏輯和你自己的邏輯之間產生張力。查看所發生情況的最好方法是將Live HTTP Headers加載項加載到Firefox。它將允許您準確查看將哪些cookie命令發送給最終用戶。您還可以強制類似的問題,看看它重建:

HttpCookie hc = new HttpCookie("testcookie", "xyz"); 
hc.Expires = DateTime.Parse("12/12/2010"); 
Response.Cookies.Add(hc); 
hc = new HttpCookie("testcookie", "abc"); 
Response.Cookies.Add(hc); 

這將導致一個HTTP標頭有兩個Set-Cookie電話:

Set-Cookie: testcookie=xyz; expires=Sun, 12-Dec-2010 07:00:00 GMT; path=/ 
Set-Cookie: testcookie=abc; expires=Sun, 12-Dec-2010 07:00:00 GMT; path=/ 

從那裏,它是由瀏覽器來決定是否第一或者最後是最終值。如果兩個瀏覽器以不同的方式進行,您最終會遇到您所描述的情況。安裝Live HTTP Headers插件並尋找類似的東西。至少,您應該考慮將「guid」作爲您應該在ASP.NET窗體應用程序中使用的cookie名稱。

如果您絕對需要讓多個地方設置相同的cookie,請嘗試先找到它(如果不存在,請創建一個新的地方)。這將確保您重寫現有Cookie的價值,而不是創建具有相同名稱的另一個Cookie。

HttpCookie hc = Response.Cookies["testcookie"]; 
if (null == hc) { 
    hc = new HttpCookie("testcookie"); 
    Response.Cookies.Add(hc); 
} 
hc.Value = "xyz";