Проблемы с обновлением Google Translate cookie в Chrome
Я пытаюсь разрешить пользователю устанавливать свой язык по умолчанию. Когда пользователь выбирает язык из раскрывающегося списка и нажимает "Сохранить", страница перезагружается, а cookie Google Translate обновляется, и поэтому сайт переводится на выбранный пользователем язык. В FF и IE пользователи могут установить язык с выпадающим списком, а затем изменить его на другой язык. Однако в Chrome пользователи могут установить язык в первый раз, но затем они не могут изменить его на другой язык.
Эта проблема появляется только на тестовом и бета-сайте - я могу обновить язык на своем локальном хосте.
Я тестирую версию Chrome 38.
Это код, который устанавливает Cookie в первый раз, а также обновляет его, когда пользователь нажимает кнопку "Сохранить".
public void ImplementUserPreferences(UserPreferences prefs)
{
//examples of prefs.GoogleTranslateDefaultLanguage:
// af, sq, ar, sp, is....
HttpCookie languageCookie = new HttpCookie("googtrans", "/en/" + prefs.GoogleTranslateDefaultLanguage);
AddOrSetCookie(languageCookie, "googtrans");
}
private void AddOrSetCookie(HttpCookie cookie, String cookieName)
{
if (System.Web.HttpContext.Current.Request.Cookies[cookieName] == null)
{
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}
else
{
System.Web.HttpContext.Current.Response.Cookies.Set(cookie);
}
}
Ответы
Ответ 1
Проверьте заголовки ответов, но я не верю, что cookie не будет отправлен в запросе, когда ваш адрес является localhost. Таким образом, с вашей логикой предпочтение будет обновляться каждый раз, так как запрос не содержит cookie.
HttpResponse не отправит обратно файлы cookie, которые пришли в запрос, добавляет только куки, которые вы хотите задать в ответе. Поэтому, когда вы тестируете на бета-сайте, запрос приходит с cookie после того, как он был установлен, и вызовет код в состоянии else. Метод HttpCookieCollection.Set(...) не добавляет куки файл, обновляет только тот, который существует в коллекции. Я бы изменил код следующим образом:
private void AddOrSetCookie(HttpCookie cookie, String cookieName)
{
if (System.Web.HttpContext.Current.Request.Cookies[cookieName] == null
|| System.Web.HttpContext.Current.Request.Cookies[cookieName].Value != cookie.Value )
{
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}
}
Ответ 2
пожалуйста, не используйте файлы cookie - вот почему html5 включает локальное хранилище
подробнее о локальном хранилище: http://www.html5rocks.com/en/tutorials/offline/storage
и для вашего сценария: http://www.codeguru.com/csharp/.net/two-ways-of-passing-html5-web-storage-data-to-asp.net.htm
кстати: эти функции также поддерживаются для IE8!!! (как показано здесь: http://caniuse.com/#search=local%20storage)