2015-07-20 2 views
11

У меня есть приложение ASP.NET, работающее на сервере в Калифорнии. текущее время сервера заключается в следующем:Когда мой cookie действительно истечет?

  • 7/20/2015 14:00 UTC-08: 00

Боб подключен к серверу. Боб находится в Техасе. Его текущее время:

  • 7/20/2015 16:00 UTC-06: 00

Мое приложение создает печенье и установить срок годности.

var name = "MyName"; 
var value = "MyValue" 
var hoursToLive = 24; 

var myCookie = new HttpCookie(name) 
{ 
    Value = value, 
    Expires = DateTime.Now.AddHours(hoursToLive) 
}; 

Будет печенье истекает через 24 часа, или он истекает через 22 часов из-за разницы во времени между Бобом и сервером? Я знаю, что DateTime.Now uses the server's local time, но неясно, как браузеры решили, что срок действия файла cookie истек (в частности, какой часовой пояс используется для определения срока действия).

+1

Почему бы не попробовать его с истечением 2 часов и посмотреть, не истечет ли он немедленно? –

+0

@AndreasNiedermair Развертывание продукта утомительно (т. Е. Требуется много часов), и я хотел бы знать, чего ожидать, прежде чем я пройду через эту боль. – Rainbolt

+0

сделать небольшое демо-приложение и использовать виртуальную машину с другим часовым поясом? –

ответ

10

Файлы cookie включают информацию о часовом поясе с заголовком expires (главным образом GMT), что делает его достаточно простым для клиента, чтобы справиться со смещением к фактическому часовому поясу сервера.

Пример: expires=Mon,20-Jul-2015 22:00:00 GMT, если 2015-07-20 14:00:00 UTC-8 - это время сервера. Когда клиент или сервер решает, истек ли файл cookie или нет, он будет сравнивать его с соответствующим временем GMT.

я копал глубже в код System.Web.HttpCookie, и нашел соответствующий код в GetSetCookieHeader():

 if (_expirationSet && _expires != DateTime.MinValue) { 
      s.Append("; expires="); 
      s.Append(HttpUtility.FormatHttpCookieDateTime(_expires)); 
     } 

Где HttpUtility.FormatHttpCookieDateTime() не возвращает UTC метки времени (без смещения, которое не имеет значения, потому что смещение будет равен нулю).

Среднее время по Гринвичу (GMT) и скоординированное всеобщее время (UTC) могут использоваться для большинства целей одинаково. Вы можете узнать больше об этом here.

+0

Я развернул демонстрационное приложение для своей машины dev и получил еще одного разработчика для подключения к нему. Его машина была на два часа раньше моей, и я установил, чтобы файл cookie истекал после 'DateTime.Now.AddHours (2)'. Файл cookie не истекал немедленно, что соответствует тому, что вы описали в своем ответе. Благодарим вас за полезное предложение в комментариях по этому вопросу. Завтра я отвечу на ваш ответ, если никто не противоречит этому. – Rainbolt

+0

@ Rainbolt благодарит за ваше редактирование, но UT на самом деле не нужен, поскольку * универсальная метка времени * означает UTC (см. Http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,fddce8be2da82dfc.references). –

+0

Нет проблем.Да, теперь я вижу, что 'ToUniversalTime()' вызывает 'ConvertTimeToUtc()'. Источником моей путаницы была терминология, и поэтому я хотел, чтобы в ответе была полная четкая терминология (в случае, если другие, подобные мне, найдут это место). Я сделал другое редактирование в этом духе, потому что мне было непонятно, что такое «универсальная метка времени». – Rainbolt

Смежные вопросы