【问题标题】:Request.Cookies is emptyRequest.Cookies 为空
【发布时间】:2016-06-07 09:46:39
【问题描述】:

如果我可以这么说的话,我一直在为一个奇怪的问题而苦苦挣扎。

我有一个控制器,我通过以下代码在其中设置了一个 cookie:

var cookie = new HttpCookie("CookieName")
            {
                Value = Guid.NewGuid().ToString(),
                Expires = DateTime.Now.AddHours(12),
                Secure = false,
            };

            Response.Cookies.Add(cookie);

这个 cookie 设置正确(我猜),因为我在我的 Chrome 和控制台的 FireFox 中都看到了这个 cookie。

我还有一段代码可以检查是否设置了特定的 cookie:

    var token = Request.Cookies.Get("CookieName");
    if (token == null)
    {
       //Create a new cookie
    }

也试过这个:

var token = Request.Cookies["CookieName"]?.Value;

但是什么都没有,当我使用调试器检查时,我发现 Request.Cookies 什么都不包含!我只是不明白这一点。

我使用 VS2015 社区,我的项目设置为通过 IIS10 启动,在 WIndows 10 Pro - 64 位上开发 我停止使用 IIS Express,因为我认为问题是由 URL 类似于 http://localhost:2322 的事实引起的,我现在处理一个 URL,我通过 Windows 上的主机文件将其设置为 127.0.0.1。例如 domainA.local。

添加了我的 web.config:

<compilation debug="true" targetFramework="4.6"/>
<httpRuntime targetFramework="4.5.1"/>
<httpCookies domain="" httpOnlyCookies="true"/>
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880"/>
</authentication>

在身份验证被评论时也尝试过


2016 年 2 月 26 日更新: 我将尝试以不同的方式解释我的问题。

我有一个 VS2015 项目,一个 ASP.NET MVC C# 应用程序。这个应用程序应该监听多个 URL。假设它应该听 www.domainA.com 和 www.thisdomainiscool.com。两个域都放在 Windows 主机文件中到 127.0.0.1。因为我在端口 80 上运行 IIS,所以它们都重定向到我的项目。

在我的代码中,我通过 Request.Cookies["cookieName"] 检查 cookie 是否存在。我还检查了 Request 中的 Url,发现它是指定的 URL 之一。根据每个网址,我加载不同的样式。我通过httpContext.Request.Url.Host 对此进行了检查,但是虽然给出了 URL,但没有给出 cookie。任何时候 cookie 都是空的,但我在我的 Chrome 控制台中看到它们,但在 Fiddler 中没有。我怎样才能使这项工作?在 Fiddler 中,我只看到 localhost:54121。我需要假设这是正确的地址吗?如果我导航到这个 URL,我会得到 404。

我希望这个解释很有意义,在此先感谢。

【问题讨论】:

  • 您是否尝试过将 CookieDomain 显式设置为空字符串?
  • 你的意思是在 webconfig 中或者当我在控制器中创建 HttpCookie 时?
  • var cookie = new HttpCookie("CookieName") { Value = Guid.NewGuid().ToString(), Expires = DateTime.Now.AddHours(12), Secure = false , Domain = "" };会是这个,但什么都没有
  • 对不起,值得一试...

标签: c# asp.net-mvc cookies


【解决方案1】:

问题是 cookie 通常与 主机名 而非 IP 地址 相关联。

当您向主机文件添加项目时,您允许 IP 堆栈将 IP 地址解析为主机名。

当您将 cookie 设置为主机名时,浏览器会解析该主机名并根据 cookie 处理该位置。

Web 服务器(在本例中为 Visual Studio)不需要这样做——它正在获取请求并且它不知道它的主机名是什么。

在 II 中,您在配置文件中进行了一些设置来解决这个问题 - 我有一段时间没有使用 VS Studio,所以可能还有另一个技巧,但解决它的简单方法是在主机上设置 cookie visual studio 认为是宿主。您可以在 fiddler 中看到响应消息。

so -- localhost127.0.0.1

(虽然 127.0.0.1 是一个 IP 地址,但您可以将 cookie 设置为一个完整的 4 位 IP 地址,因为它不会导致安全问题。)

真的没有其他办法可以解决这个问题。


解决 cookie 问题的最佳方法是使用 fiddler。 Fiddler 是一个多年前编写的实用程序,并且一直是免费的。 Telerik 购买了它,但您仍然可以通过http://www.telerik.com/fiddler免费获得它

使用 fiddler,您可以查看进出浏览器的流量,并查看从双方发送的 cookie - 您还可以更改它们以执行测试。

我预计在安装 fiddler 大约 10 分钟后,您就会知道问题所在——这将比我们所有人猜测的要高效得多。

【讨论】:

  • 嗨,霍根,还没有考虑过使用这个,很好的建议,谢谢。所以我安装了它,疯狂的部分是在请求和响应中都没有 cookie?但为什么 FireFox 会看到它们呢?也是一个疯狂的笔记,当我像你一样去 domain.local 或 domain.com 时,在 Fiddler 我看到 Localhost:63694 ....
  • 你为什么要去 domain.local 或 domain.com ——这是我预料到的问题,因为你需要一个 cookie 的域,但你正在本地测试它。
  • 我使用了一个域,因为它也无法在 localhost:12321 或 IIS Express 上运行,我就是不明白,我在控制台浏览器中看到了 cookie
  • 每个 cookie 都与一个 URL 相关联——您应该能够在 fiddler 和浏览器中看到 URL 是什么。它们在提琴手和浏览器中应该是相同的。如果它们不相同,这就是您在两个地方看到的结果不同的原因。
  • 好的,我知道错误是什么,在提琴手中,URL 是 localhost:53338,我通过 domainA.com 调用该站点。如何使我从浏览器调用 domainA.com 并且 cookie 正确链接?该站点侦听多个 URL,我认为对于每个 URL,cookie 都是单独跟踪的
【解决方案2】:

这对我有用,

var cookie = new HttpCookie("CookieName")
        {
            Value = Guid.NewGuid().ToString(),
            Expires = DateTime.Now.AddHours(12),
            Secure = false,
        };

        Response.Cookies.Add(cookie);

添加 cookie

if (Request.Cookies["CookieName"] == null)
{
    var cookie = new HttpCookie("CookieName");
    cookie.Value = Guid.NewGuid().ToString();
    cookie.Expires = DateTime.Now.AddHours(12);
    cookie.Secure = false;
    Response.Cookies.Add(cookie);
}

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2023-01-07
    • 2013-09-16
    • 2011-07-30
    相关资源
    最近更新 更多