Срок действия файлов cookie не работает в C # - PullRequest
8 голосов
/ 23 января 2012

Я пытаюсь создать постоянный файл cookie, используя C # 4.0 и этот код:

HttpCookie AssoCookie = new HttpCookie("AssociateCode", AssociateCode);
AssoCookie.Expires = DateTime.Now.AddMonths(6);
HttpContext.Current.Response.Cookies.Add(AssoCookie);

К сожалению, это не работает, и cookie истекает сессия. Если я использую плагин Web Developer в Firefox, чтобы проверить его, я вижу эту информацию:

Name    AssociateCode
Value   test
Host    localhost
Path    /
Secure  No
Expires At End Of Session

Файл cookie, который я создаю в качестве теста, только что создан там, никто другой не управляет им и не редактирует его, поэтому он не может быть перезаписан. У меня ничего не настроено в webconfig, чтобы установить срок действия файлов cookie (в любом случае это должно переопределить это), и если я установлю время истечения срока действия некоторых файлов cookie, это не сработает.

Я немного растерялся, каждое руководство, учебник, блог, что бы я ни проверял, говорит, что вам просто нужно установить дату окончания срока действия, я отлажен, я проверил, что оно действительно имеет это значение при создании и в конце Page_PreRender но он просто заканчивается сессией, что бы я ни делал.

Есть идеи?

Я использую Firefox 9.0.1.

Обновление

Используя плагин Firebug в Firefox для проверки заголовков ответов, я получаю это:

Response Headersview source
Cache-Control   private
Connection  Close
Content-Length  21322
Content-Type    text/html; charset=utf-8
Date    Mon, 23 Jan 2012 16:47:08 GMT
Server  ASP.NET Development Server/10.0.0.0
Set-Cookie  AssociateCode=test; expires=Mon, 23-Jul-2012 16:09:04 GMT; path=/
X-AspNet-Version    4.0.30319

И используя Fiddler я получаю это:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: AssociateCode=; expires=Mon, 23-Jul-2012 16:27:29 GMT; path=/
X-Powered-By: ASP.NET
Date: Mon, 23 Jan 2012 17:27:29 GMT
Content-Length: 21313

** Обновление 2 ** Я проверяю, что Cookie не существует, просто проверяя файлы cookie моего Firefox, но, на случай, если вы захотите узнать, как я получу его позже в коде (необязательно, так как его там нет в любом случае):

try {
    AssociateCode = HttpContext.Current.Request.Cookies.Get("AssociateCode").Value;
} catch { }

Ответы [ 3 ]

6 голосов
/ 23 января 2012

Просто чтобы прокомментировать мой комментарий:

Информация из инструментов fiddler и firefox показывает, что вы отправляете правильную информацию для создания файла cookie.

Это заставляет меня поверить, что вы неправильно проверяете его существование.

При проверке, передается ли cookie в ваше приложение, вы должны использовать контейнер Request.Cookies, чтобы проверить, есть ли он там. (обратите внимание, что это ЗАПРОС не ОТВЕТ ).

Если вы тестируете, используя что-то вроде:

if (Response.Cookies["mycookie"] == null) { .. }

Тогда это приведет к созданию нового файла cookie в объекте ответа, который будет пустым.

Подведем итог: объект Request будет содержать все, что отправлено из браузера. Объект Response - это все, что вы отправляете в браузер.

3 голосов
/ 24 января 2012

Хорошо, все.Мне очень жаль, но, кажется, по какой-то причине я настроил свои браузеры давным-давно на удаление файлов cookie, когда закрывал окна, поэтому, несмотря на то, что файлы cookie были созданы правильно, браузер установил их в качестве файлов cookie сеанса не потому, что они были, а из-за параметров браузера.

На самом деле, если бы я перешел к управлению Cookies в Firefox, я мог бы снять флажок с опции «Session Cookie» в cookie, и тогда Дата истечения была правильной, но по какой-то причине этот параметр проверки был проверендефолт.Я подумал, что, возможно, есть способ установить, является ли Cookie сессионным Cookie или нет, или, может быть, .Net что-то делал, пока я не осознал это.

Ну, когда кажется, что ничего не работает, вы знаете проблемуэто самая глупая вещь, которую вы можете себе представить ...

Снова извините.

3 голосов
/ 23 января 2012

Вы пытались использовать функцию SetCookie вместо Add?

HttpCookie cookie = new HttpCookie("test");
cookie.Expires = DateTime.Now.AddHours(10);
HttpContext.Current.Response.SetCookie(cookie);

Просто проверил это быстро, и оно работает для меня.

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