ASP.NET帮助! FireFox正在吃我的饼干!

问题描述:

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

我试图通过我的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

首先,DateTime有一个类型安全的构造函数,它是new DateTime(2010, 12, 12)

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

+0

呃,应该是同一个名字 - 那不是问题。 – 2010-02-11 14:49:26

这是我用来添加/获取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

在幕后,你可能设置相同的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";