InternetSetCookieEx InternetGetCookieEx Cookie никогда / никогда не истекает - PullRequest
0 голосов
/ 24 марта 2019

У меня проблема, я получаю головную боль с кодом 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);

Но это не работает, я все еще получаю cookie "expiration" в моем результате lpszCookieData

Забавный факт, это случается со мной только тогда, когда я использую Windows 7 (проверено на 2 машинах), но хорошо работает на Windows 10

Любые идеи о том, что я могу сделать неправильно ???Я также пытался использовать InternetGetCookie и InternetSetCookie и получил тот же результат.

Заранее благодарен за вашу помощь.

Редактировать: изменил название с Никогда на Никогда / Всегда.Потому что после нахождения решения я понимаю, что проблема может быть разной в зависимости от того, где вы находитесь на Земле:)

1 Ответ

0 голосов
/ 25 марта 2019

Что ж, я наконец-то нашел решение

после того, как сделал это:

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

и прочитал HttpWebResponse.Headers, где оно получилось как:

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

я заметилчто файлы cookie, хранящиеся в HttpWebResponse.Cookies, имеют Cookie.Expires на основе Machine DateTime Mon, 25-Mar-2019 14:47:30 GMT (как вы получите с DateTime.Now), а не на UTC DateTime (например: DateTime.UtcNow)

Asя строил свое строковое значение cookie для InternetSetCookieEx на основе HttpWebResponse.Cookies.Затем я получил + 1 час (потому что я во Франции) с истекающим DateTime, который, по сути, должен быть UTC DateTime.

Решением было преобразовать его в UTC следующим образом:

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

Моя последняя мысль: в Windows 10 должно быть какое-то исправление, которого нет в Windows 7 для InternetSetCookieEx.Он автоматически корректирует время истечения до UTC, если строка, содержащая GTM DateTime, неверна.(это, вероятно, не точно, но у вас есть идея)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...