我有一个问题,我很头疼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并获得了相同的结果。
预先感谢您的帮助。
编辑:将标题从“从不”更改为“从不/始终”。因为找到解决方案后,我知道问题可能会因您在地球上的位置而有所不同:)
答案 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
)
当我基于InternetSetCookieEx
为HttpWebResponse.Cookies
构建cookie字符串值时。然后我在到期的DateTime上得到了一个+ 1小时的时间(因为我在法国),实际上应该是UTC DateTime。
解决方案是像这样将其转换为UTC:
Values += "; expires=" + Cookie.Expires.ToUniversalTime().ToString("R");
我最后的要点是,Windows 10中必须进行某种InternetSetCookieEx
的Windows 7不存在的更正。如果包含GTM DateTime的字符串错误,它将自动将到期时间更正为UTC。
(可能不完全正确,但是您已经有了主意)