Подтвердить что ты не робот

Проблемы с обновлением 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);
    }
}
4b9b3361

Ответ 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)