C# Internet Explorer中的持久cookie不工作
我在Internet Explorer中遇到一个持久cookie问题,即我可以设置cookie,但不能使它们持久。我正在使用Internet Explorer 11,并尝试了Internet选项->高级->重置,但没有帮助 我编写了以下测试代码: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
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头被一些浏览器忽略,但被其他浏览器读取,第二个不是持久的,第一个是值得检查的。