请求Cookie在同一请求上下文中访问时不更新

时间:2018-02-20 21:16:33

标签: c# .net asp.net-mvc cookies umbraco7

我已经看了很多类似的问题,但没有解决我的问题。我将用户语言保存在cookie中。首先,它是一个Umbraco网站。我有一个默认控制器,每个请求都会被命中以检查语言。

我做一些计算来检查用户应该在控制器中使用哪种语言,然后像下面那样设置cookie。

 private void SetCulture(string language, bool updateCookie)
 {
     if (updateCookie)
     {
         var newCookie = new HttpCookie("currentLanguage", language) { Expires = DateTime.Now.AddDays(30) };
         Response.Cookies.Add(newCookie);
         Request.Cookies.Add(newCookie);
     }
     System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language);
     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
 }

目前,我正在更新请求和响应Cookie。问题是在我点击控制器之后,我加载了我的视图。在我看来,我使用帮助器来获取当前的cookie值,但请求中的cookie尚未更新并仍保持其原始值。例如,假设用户在EN页面上,他们使用语言切换器更改为FR,我使用上面的SetCulture方法更新控制器中的cookie,但是在我的帮助程序类中,cookie仍设置为原始EN值。 CookieHelper位于下方。

public static class CookieHelper
{
     public static string GetLanguageCookie()
     {
         var newCookie = HttpContext.Current.Request.Cookies["currentLanguage"];

         return newCookie?.Value ?? "en";
     }

     public static void UpdateLanguageCookie(string lang)
     {
         var newCookie = HttpContext.Current.Request.Cookies["currentLanguage"];
         if (newCookie?.Value != null)
         {
             newCookie.Value = lang;
             newCookie.Expires = DateTime.Now.AddDays(30);
         }
         else
         {
             CreateLanguageCookie(lang);
         }

      }

      public static void CreateLanguageCookie(string lang)
      {
          var newCookie = new HttpCookie("currentLanguage", lang) { Expires = DateTime.Now.AddDays(30) };
          HttpContext.Current.Response.Cookies.Add(newCookie);
      }
 }

以下控制器仅针对问题相关代码进行了删减。为了澄清,该网站分为英国,法国和德国的区域部分。每个地区网站都有一组允许的语言DE =" en,de" uk =" en"和fr =" fr"。奇怪的设置我知道,但我只是遵循规范。希望解释使代码更清晰。

public class BaseRenderController : RenderMvcController
    {
        public override ActionResult Index(RenderModel model)
        {
            var language = Request.UserLanguages.First().ToLowerInvariant().Substring(0, 2);
            // If true it means where on the language select screen.
            if (Request.Url.Segments.Length == 1)
            {
                if (language == "en")
                {
                    SetCulture("en", false);
                }
                else if (language == "fr")
                {
                    SetCulture("fr", false);
                }
                else if (language == "de")
                {
                    SetCulture("de", false);
                }
                else
                {
                    SetCulture("en", false);
                }
            }
            else
            {
               var currentLang = CookieHelper.GetLanguageCookie();

               if (Helpers.UrlHelper.GetRegionalSegmentFromUrl().Substring(1).ToLower() == "uk")
               {
                   SetCulture("en", true);
               }
               else if (Helpers.UrlHelper.GetRegionalSegmentFromUrl().Substring(1).ToLower() == "fr")
               {
                   SetCulture("fr", true);
               }
               else if (Helpers.UrlHelper.GetRegionalSegmentFromUrl().Substring(1).ToLower() == "de")
               {
                   if (language == "de" || currentLang == "de")
                   {
                       SetCulture("de", true);
                   }
                   else
                   {
                       SetCulture("en", true);
                   }
               }
            }


            return base.Index(model);
        }

        private void SetCulture(string language, bool updateCookie)
        {
            if (updateCookie)
            {
                var newCookie = new HttpCookie("currentLanguage", language) { Expires = DateTime.Now.AddDays(30) };
                Response.Cookies.Add(newCookie);
                Request.Cookies.Add(newCookie);
            }
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
        }
    }

1 个答案:

答案 0 :(得分:0)

浏览器在发送请求时设置cookie。 ASP.NET提供从Request对象访问Cookie的权限。要设置cookie,您需要在Response对象上设置它。或者正如Miscrosoft的文档所述:

  

浏览器负责管理用户系统上的cookie。   Cookie通过HttpResponse对象发送到浏览器   公开名为Cookies的集合。您可以访问HttpResponse   object作为Page类的Response属性。任何饼干   您要发送到浏览器的必须添加到此集合中。

https://msdn.microsoft.com/en-us/library/ms178194.aspx