2012-01-18 6 views
12

में कुकी अपडेट करने में असमर्थ मैं इस पर पागल हो रहा हूं। मैं एक कुकी को लिख सकता हूं, और फिर इसे फिर से पढ़ सकता हूं। लेकिन किसी बिंदु पर, मैं उस मान को अपडेट करना चाहता हूं जो उसके पास है। जब भी मैं कुकी को फिर से प्राप्त करता हूं, मुझे प्रारंभिक मान मिलता है, अद्यतन नहीं। नीचे कोड है जिसे मैं लिखने/अपडेट करने और कुकी के पढ़ने के लिए उपयोग करता हूं।ASP.NET

private static HttpCookie WriteCookie(Guid siteId, string siteName) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if(cookie != null) { 
      cookie.Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }); 
      HttpContext.Current.Response.Cookies.Set(cookie); 
     }else { 
      cookie = new HttpCookie("UserSettings") { Path = "/", Expires = DateTime.Now.AddDays(1), Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }) }; 
      HttpContext.Current.Response.Cookies.Add(cookie); 
     } 
     return cookie; 
    } 

    public static UserSettingsModel GetUserSettings(string username = null) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if (cookie == null || string.IsNullOrEmpty(cookie.Value)) 
     { 
      cookie = ResetUserSettings(); 
     } 
     var userSettings = DecryptObject<UserSettingsModel>(cookie.Value); 
     if (userSettings != null) 
     { 
      var siteId = userSettings.SiteID; 
      var siteName = userSettings.SiteName; 
      return new UserSettingsModel { SiteID = siteId, SiteName = siteName }; 
     } 
     throw new SecurityException("You have no site attached to your user. Contact an administrtor."); 
    } 

GetUserSettings हमेशा मूल्य है कि कुकी शुरू में साथ बनाया गया था देता है। क्या गलत है?

संपादित करें:

मैं एक नियंत्रक में एक विधि से सीधे WriteCookie बुला की कोशिश की। कुकी अब सेट किया गया था। मैं आमतौर पर एक अजाक्स अनुरोध के माध्यम से WriteCookie कहा जाता है। अब, क्या मुझे वास्तव में जावास्क्रिप्ट का उपयोग करके कुकी लिखनी है, या क्या मैं किसी भी तरह से WriteCookie का उपयोग कर इसे कर सकता हूं?

धन्यवाद!

+0

क्या आपने वास्तव में फिडलर का उपयोग करके क्या भेजा है? विशेष रूप से समाप्ति और पथ को देखो। – Oded

+0

मैं क्रोम ब्राउज़र का उपयोग कर रहा हूं, और एकीकृत डेवलपर टूल का उपयोग कर रहा हूं, मैं देख सकता हूं कि कुकी मान कभी अपडेट नहीं होता है। मुझे आश्चर्य है कि – Andreas

+0

क्या हो रहा है यह देखने के लिए अनुरोध और प्रतिक्रिया शीर्षलेख देखें। – Oded

उत्तर

17

इस तरह का प्रयास करें:

var response = HttpContext.Current.Response; 
response.Cookies.Remove("UserSettings"); 
response.Cookies.Add(cookie); 

लेकिन मुझे लगता है अपने वास्तविक समस्या यह है कि आप WriteCookie विधि और एक ही HTTP अनुरोध में GetUserSettings विधि है जो के रूप में आप सोच सकते हैं कि यह होगा काम नहीं करता है बुला रहे हैं यह है कि या जैसा कि आप इसकी उम्मीद कर सकते हैं।

WriteCookieरिस्पांस इतना है कि यह अनुवर्ती अनुरोधों पर उपलब्ध है कुकी लिखते हैं लेकिन GetUserSettingsअनुरोध ताकि आप था कि शुरू में यह अनुरोध सेट कुकी का मान हो रही है से कुकी को पढ़ता है शुरू किया गया था कि निश्चित रूप से पुराना मूल्य है। तो उपयोगकर्ता सेटिंग्स कुकी के मान को अद्यतन करने के लिए WriteCookie पर कॉल करने के बाद, एक रीडायरेक्ट करें और केवल बाद के अनुरोध पर GetUserSettings विधि का उपयोग करें।

एएसपी.नेट एमवीसी में भी आप आम तौर पर स्थैतिक HttpContext.Current ऑब्जेक्ट का उपयोग नहीं करना चाहते हैं, लेकिन यह ढांचा आपको प्रदान करने वाले अवशेषों का उपयोग करना चाहते हैं। मुझे पता है कि आपने उन 2 विधियों को स्थिर के रूप में लिखा है, लेकिन उदाहरण के लिए आपको HttpContextBase ऑब्जेक्ट के लिए उन्हें एक विस्तार विधि के रूप में लिखा जाना चाहिए था। इस तरह आप उन्हें कहीं भी कह सकते थे जहां आपके पास इस अमूर्त बेस क्लास का उदाहरण था, जो एएसपी.नेट एमवीसी आपको HTTP अनुरोध के जीवनकाल के दौरान कई आम स्थानों में प्रदान करता है।

+0

मैंने सुझाव दिया है कि आपने हटाने और फिर जोड़ने का प्रयास किया है। वह काम नहीं किया। WriteCookie को अजाक्स कॉल का उपयोग करके बुलाया जाता है। जब यह कॉल लौटाता है, पृष्ठ को ताज़ा किया जाता है और GetUserSettings को कॉल किया जाता है। तो कॉल अलग-अलग अनुरोधों में हैं। अपंग अजाक्स कॉल का उल्लेख न करें और फिर पुनः लोड करें। मुझे पता है कि इसे साफ किया जाना चाहिए। – Andreas

+0

पृष्ठ "window.location.reload();" का उपयोग करके ताज़ा किया गया है। लेकिन मैंने Ctrl + F5 करने का प्रयास किया और मुझे अभी भी पुराना मान मिलता है। मुझे एहसास है कि बाकी केवल पहली बार मारा गया है। इस तरह से काम करना चाहिए। यदि कोई कुकी है, तो कुकी को अपडेट किया जाना चाहिए। अन्यथा इसे – Andreas

+1

बनाया जाना चाहिए समस्या यह थी कि मैं WriteCookie को अजाक्स अनुरोध से कॉल कर रहा था। मैं कोड को फिर से लिखता हूं, इसलिए कुकी अब जावास्क्रिप्ट के माध्यम से सेट है। अब आकर्षक के रूप में काम करता है। सही दिशा में इंगित करने के लिए धन्यवाद – Andreas