C# Internet Explorer中的持久cookie不工作

C# Internet Explorer中的持久cookie不工作,c#,internet-explorer,cookies,C#,Internet Explorer,Cookies,我在Internet Explorer中遇到一个持久cookie问题,即我可以设置cookie,但不能使它们持久。我正在使用Internet Explorer 11,并尝试了Internet选项->高级->重置,但没有帮助 我编写了以下测试代码: class Program { public static void Main(string[] args) { HttpListener listener = new HttpListener(); liste

我在Internet Explorer中遇到一个持久cookie问题,即我可以设置cookie,但不能使它们持久。我正在使用Internet Explorer 11,并尝试了Internet选项->高级->重置,但没有帮助

我编写了以下测试代码:

class Program {
    public static void Main(string[] args) {
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://+:7777/");
        listener.Start();

        ThreadPool.QueueUserWorkItem((o) = > {
            while (listener.IsListening) {
                ThreadPool.QueueUserWorkItem((c) = > {
                    HandleRequest(c as HttpListenerContext);
                }, listener.GetContext());
            }
        });

        Console.Write("Press any key to quit . . . ");
        Console.ReadKey(true);
        listener.Stop();
        listener.Close();
    }

    static void HandleRequest(HttpListenerContext ctx) {
        var cookie = ctx.Request.Cookies["TestCookie"];

        if (cookie == null) {
            Console.WriteLine("Setting cookie...");
            var expiryDate = DateTime.UtcNow.AddDays(360);
            ctx.Response.Headers["Set-Cookie"] = "TestCookie=some_value; Path=/; Expires=" + expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss") + " GMT; HttpOnly";
        } else {
            Console.WriteLine("Cookie: " + cookie);
        }
        ReturnString(ctx, "OK");
    }

    protected static void ReturnString(HttpListenerContext ctx, String s) {
        try {
            byte[] buf = Encoding.UTF8.GetBytes(s);
            ctx.Response.ContentLength64 = buf.Length;
            ctx.Response.OutputStream.Write(buf, 0, buf.Length);
        } catch (Exception e) {

        } // suppress any exceptions
        finally {
            // always close the stream
            ctx.Response.OutputStream.Close();
        }
    }
}
现在,当访问127.0.0.1:7777时,我首先获取设置cookie,然后在所有后续请求上获取cookie:TestCookie=some_值。在Chrome浏览器中,cookie是持久的,我可以关闭浏览器,重新启动它,但仍然可以得到cookie:TestCookie=some\u值,但这在Internet Explorer中不起作用。也就是说,在使用IE时,每次重新启动浏览器时,我都会在第一次请求时获得设置cookie。所以饼干显然已经不存在了


为什么会这样?我做错什么了吗?当然,一定有某种方法可以使用C服务器在IE中设置持久cookie吗?

您可以将您的站点添加到IE属性中的受信任区域吗?这听起来可能与安全设置有关。

此问题可能是由于隐私政策造成的。需要将标头设置为允许来自其他域的Cookie。请检查


嗯,我找到了答案。真的很简单,让人难堪。设置到期日期时,我使用了代码

expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss")
当然,这会创建日期的本地化表示。因为我在挪威,ddd用挪威语创造了一周中的一天。当然,IE无法解析这一点

这一简单的改变解决了问题:

expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss", System.Globalization.CultureInfo.InvariantCulture)

各位,很抱歉给你们添了这么多麻烦。

好吧,我可以进入安全->网页隐私政策->单击127.0.0.1->摘要,然后选择始终允许此网站使用cookies。这解决了问题,但我认为我不能要求普通用户这样做。因此,我正在寻找一种方法,使这项工作与IE默认设置。这很好。我只是想建立一个场景。关于它可能被阻止的原因,可能的原因是它可能认为cookie是第三方cookie。例如,如果您将cookie设置为“localhost”,但如果它是从iframe中设置的,则导航到127.0.0.1,或者如果cookie中的数据包含IE认为可用于联系您的信息,例如电子邮件地址。对于IE,通常值得包括一个P3P标题,告诉IE你的站点不是完全不安全的。你试过P3P吗?我一直使用127.0.0.1,在我的场景中从未使用过localhost。而且没有框架。数据是Base64编码的字符串,与电子邮件地址完全不同。我尝试过P3P,但还没有投入足够的时间来正确理解它,所以基本上我只是加入了一些我通过谷歌搜索找到的P3P内容。好吧,接下来我可能会尝试找到一个网站,它确实在IE中存储持久的cookie,也许是通过像Telerik的fiddler这样的代理,并将该站点发送的消息头(特别是Set-Cookie消息头)与您自己发送的消息头进行比较,以查看是否存在任何其他明显差异。我在过去看到过一些问题,例如,对于一个响应,有多个Set cookie头被一些浏览器忽略,但被其他浏览器读取,第二个不是持久的,第一个是值得检查的。