InternetSetCookieEx InternetGetCookieEx Cookie永不/永远过期

时间:2019-03-24 19:31:47

标签: c# cookies

我有一个问题,我很头疼C#代码和一个不会过期的cookie。

我正在使用以下导入的功能

[DllImport("wininet.dll", SetLastError = true, ExactSpelling = true, EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode)]
        static extern bool InternetGetCookieEx([In]string lpszUrl, [In]string lpszCookieName, [Out] StringBuilder lpszCookieData, [In, Out] ref UInt32 lpdwSize, uint dwFlags, IntPtr lpReserved);

[DllImport("wininet.dll", SetLastError = true, ExactSpelling = true, EntryPoint = "InternetSetCookieExW", CharSet = CharSet.Unicode)]
        static extern bool InternetSetCookieEx([In]string lpszUrl, [In]string lpszCookieName, [In]string lpszCookieData, uint dwFlags, [In] IntPtr dwReserved);

然后我做

InternetSetCookieEx("http://localhost/index.php", null, "expiration=for+5+seconds; expires=Sun, 24-Mar-2019 20:16:35 GMT; path=/", 0, IntPtr.Zero)

然后我10秒钟后

InternetGetCookieEx("http://localhost/index.php", null, lpszCookieData, ref lpdwzSize, 0, IntPtr.Zero);

但是它不起作用,我仍然在lpszCookieData结果中得到“过期” cookie

有趣的是,只有当我使用Windows 7(在2台机器上测试)但在Windows 10上运行良好时,这种情况才会发生

关于我可能做错什么的任何想法??? 我也尝试使用InternetGetCookie和InternetSetCookie并获得了相同的结果。

预先感谢您的帮助。

编辑:将标题从“从不”更改为“从不/始终”。因为找到解决方案后,我知道问题可能会因您在地球上的位置而有所不同:)

1 个答案:

答案 0 :(得分:0)

好吧,我终于找到了解决方法

这样做之后:

HttpWebResponse HttpWebResponse = (HttpWebResponse)HttpWebRequest.GetResponse();

并读取HttpWebResponse.Headers,结果为:

Set-Cookie: expiration=for+5+seconds; expires=Mon, 25-Mar-2019 13:47:30 GMT; path=/

我注意到,存储在HttpWebResponse.Cookies中的cookie具有一个Cookie.Expires,它基于计算机DateTime Mon, 25-Mar-2019 14:47:30 GMT(就像您使用DateTime.Now一样),而不是UTC DateTime(例如:DateTime.UtcNow

当我基于InternetSetCookieExHttpWebResponse.Cookies构建cookie字符串值时。然后我在到期的DateTime上得到了一个+ 1小时的时间(因为我在法国),实际上应该是UTC DateTime。

解决方案是像这样将其转换为UTC:

Values += "; expires=" + Cookie.Expires.ToUniversalTime().ToString("R");

我最后的要点是,Windows 10中必须进行某种InternetSetCookieEx的Windows 7不存在的更正。如果包含GTM DateTime的字符串错误,它将自动将到期时间更正为UTC。 (可能不完全正确,但是您已经有了主意)