Request.Cookies为空

时间:2016-02-24 21:23:51

标签: c# asp.net-mvc cookies

如果我可以这么说的话,我已经遇到了一个奇怪的问题。

我有一个控制器,我通过以下代码设置了一个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,因为我认为这个问题是由于网址是http://localhost:2322而引起的,我现在处理的是一个网址,我通过Windows上的Host文件将其发送到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,所以它们都重定向到我的项目。

在我的代码中,如果cookie存在,我通过Request.Cookies [“cookieName”]进行检查。我还检查了请求中的Url,看到它是指定的URL之一。根据每个网址,我加载了不同的风格。我通过httpContext.Request.Url.Host检查这个但是虽然提供了URL,但cookie不是。任何时候cookie都是空的,但我在Chrome的控制台中看到它们,但不是在Fiddler中。我怎样才能做到这一点?在Fiddler我只看到localhost:54121。我需要假设这是正确的地址吗?如果我导航到此URL,我会收到404。

我希望这个解释很有意义,提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

在IIs中,您在配置文件中进行了设置以解决此问题 - 我暂时没有使用VS工作室,因此可能有另一种技巧,但解决它的简单方法是在主机上设置cookie视觉工作室认为是主持人。您可以在fiddler中看到响应消息。

所以 - localhost 127.0.0.1

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

没有其他方法可以解决这个问题。

解决cookie问题的最佳方法是使用fiddler。 Fiddler是一个多年前写的实用工具,一直都是免费的。 Telerik购买了它,但您仍可以http://www.telerik.com/fiddler

免费获得

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

我希望在安装提琴手后大约10分钟,你会知道问题是什么 - 这比我们想要猜测的所有人都要高效。

答案 1 :(得分:0)

这对我有用,

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);
}