【问题标题】:ASP.NET Help! FireFox is eating my cookies!ASP.NET 帮助! FireFox 正在吃我的饼干!
【发布时间】:2010-02-18 00:13:27
【问题描述】:

IE 可以正常工作,但 FireFox 不行。

我正在我的 default.aspx 页面上设置一个 cookie:

    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 会话变量。有什么想法吗?

【问题讨论】:

  • 让我想起了这个Sesame Street 角色...
  • Firefox 会阻止 cookie 吗? wilderssecurity.com/showthread.php?t=246106你在用Session吗?它在 Firefox 中有效吗?
  • OM NOM NOM? (对不起,忍不住)
  • 请发布页面的响应标题。
  • 您是使用标准<input type="file" /> 上传还是通过Flash 控件上传?如果您使用的是 Flash,请参阅我的回答。

标签: asp.net firefox session cookies swfupload


【解决方案1】:

我在尝试通过我的 Flex 应用程序在 Firefox 中上传文件时遇到了同样的问题。如果你也在使用 Flash,你可能想做我所做的;如果您使用的是 HTML 控件,这可能适用也可能不适用。

我为解决 Firefox 问题所做的工作是在服务器上发出一次性使用令牌,然后在上传时发布该令牌(例如,它可能是表单中的隐藏字段)。如果在上传时识别到令牌,则处理上传,然后令牌过期。所以这基本上就是你正在做的事情,只是没有使用 cookie。

【讨论】:

  • 这就是我最终实现的——我在页面呈现之前向 swfupload 控件添加了一个参数。这样它就在标题中,而不依赖于 cookie/会话。好建议。谢谢。
  • 所以这与 Adob​​e 有关,即使最初的问题根本没有提到它?
  • 我猜的差不多了,因为我在通过 Flash 上传时遇到了同样的问题。我更新了问题,所以它提到了 SWFUpload。
【解决方案2】:

这是我用来添加/获取 cookie 值的方法。在 IE 和 FF 中都适用于我

添加Cookie:

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

获取Cookie:

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

【讨论】:

  • +1 因为我不同意 -1。您唯一可以添加的另一件事是“我们需要更多信息,说明您的设置为何与此不同”。
【解决方案3】:

在幕后,您可能两次设置了相同的 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);

这会产生一个带有两个 Set-Cookie 调用的 HTTP 标头:

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";

【讨论】:

    【解决方案4】:

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

    其次,您为 cookie 使用了不同的名称:guidapplicationGuid。使用其中之一,而不是两者。

    【讨论】:

    • 呃,应该是同名——这不是问题。
    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多