2011-12-21 21 views
14

संभव डुप्लिकेट:
Cache v.s SessionHttpRuntime.Cache और सत्र के बीच क्या अंतर है?

मैं कुछ कोड एक मूल्य के स्टोर करने के लिए HttpRuntime.Cache का उपयोग करता है का उपयोग कर रहा हूँ। हालांकि जब मैं खिड़की बंद करता हूं तो कैश चला जाता है। इस सत्र का उपयोग करने के लिए कोई फायदा है?

यहाँ मेरी कोड है:

protected dynamic Code() 
{ 
    dynamic code; 

    if (String.IsNullOrEmpty(myHttpContext.Request.QueryString["code"])) 
    { 
     code = HttpRuntime.Cache["code"]; 
    } 
    else 
    { 
     code = myHttpContext.Request.QueryString["code"]; 
     HttpRuntime.Cache.Insert("code", myHttpContext.Request.QueryString["code"]); 
    } 

    return code; 
} 

protected string GetAccessToken(bool regenerate = false) 
{ 
    if (HttpRuntime.Cache["access_token"] == null || regenerate == true) 
    { 
     try 
     { 
      Dictionary<string, string> args = GetOauthTokens(myHttpContext.Request.QueryString["code"]); 
      HttpRuntime.Cache.Insert("access_token", args["access_token"], null, DateTime.Now.AddMinutes(Convert.ToDouble(args["expires"])), TimeSpan.Zero); 
     } 
     catch 
     { 
      OutputError("Code", "Bad Verification Code"); 
     } 
    } 

    return HttpRuntime.Cache["access_token"].ToString(); 
} 

उत्तर

22

HttpRuntime.Cache आवेदन के लिए वैश्विक है, यह वेब साइट के सभी उपयोगकर्ताओं/सत्रों के बीच साझा किया जाता है।

Session प्रति उपयोगकर्ता सत्र अद्वितीय है। Session में कौन सा उपयोगकर्ता सत्र स्टोर उस सत्र के लिए निजी है। एक और सत्र का अपना भंडारण होगा।

+0

हाय तो HttpRuntime.Cache ["access_token"] सभी उपयोगकर्ताओं के लिए दृश्यमान है? इस तरह यह ट्यूटोरियल में लिखा गया था, यह तब एक बहुत बड़ी सुरक्षा भेद्यता होगी! – Darren

+1

सत्र प्रति कार्यकर्ता थ्रेड के अनुसार अद्वितीय है http://stackoverflow.com/questions/2151251/asp-net-web-garden-how-many-worker-processes-do-i-need – Jeff

+1

@ जेफ। उस सवाल में कहा गया है कि सामान्य इनप्रोक सत्र भंडारण के साथ, 'सत्र' प्रति कार्यकर्ता * प्रक्रिया * अद्वितीय है, प्रति * थ्रेड * नहीं। अंतर बहुत बड़ा है - एएसपी.नेट हमेशा कई धागे का उपयोग करता है, लेकिन कॉन्फ़िगर किए जाने पर ही कई प्रक्रियाएं होती हैं। कई कार्यकर्ता प्रक्रियाओं के साथ, 'सत्र' शायद प्रक्रिया से बाहर संग्रहीत किया जाना चाहिए जो संभव है। –

4

संभावित रूप से आप कैश को स्पष्ट रूप से देख रहे हैं कि यह है कि जब आप अपनी साइट को पुन: चला रहे हैं तो आप अपने वेब सर्वर को पुनरारंभ कर रहे हैं। यह कैश ऑब्जेक्ट की तरह प्रतीत होता है और सत्र उसी तरह व्यवहार कर रहा था जब वास्तव में वे बहुत अलग होते हैं।

यह उदाहरण के लिए हो सकता है कि यह वेब सर्वर के रूप में साइट चलाते समय विजुअल स्टूडियो के अंतर्निहित वेब सर्वर का उपयोग करते समय होता है।

बस एक विचार।

1

कैश ऑब्जेक्ट केवल स्मृति में रहता है और एप्लिकेशन के लिए वैश्विक है। किसी भी समय ASP.NET द्वारा ऑब्जेक्ट को कैश से हटाया जा सकता है (हालांकि आप इसे कैश में तर्क के साथ कुछ डिग्री पर प्रभावित कर सकते हैं। जोड़ें())। जब ऐपपूल निष्क्रियता के कारण रीसायकल या बंद हो जाता है, या यदि आप अपने एप्लिकेशन को पुनरारंभ करते हैं (जैसे web.config को बदलकर), तो कैश भी गिरा दिया जाएगा।

बस एक वेब पेज बंद करना कैश छोड़ने के लिए पर्याप्त नहीं है।

सत्र ऑब्जेक्ट प्रति उपयोगकर्ता सत्र अद्वितीय है (आमतौर पर प्रति ब्राउज़र उदाहरण अद्वितीय)। प्रत्येक अनुरोध के अंत में, या तो SQL सर्वर में क्रमबद्ध और संग्रहीत किया जा सकता है, या केवल स्मृति (इनप्रोक मोड) में रखा जा सकता है, या धारावाहिक और स्टेटसर्वर नामक एक विशेष ऐप को भेजा जा सकता है। अगर यह स्मृति में संग्रहीत है, तो यह कैश के समान स्थितियों के तहत खो जाएगा। यदि यह SQL सर्वर पर लिखा गया है, तो यह सत्र समाप्त होने तक रखा जाएगा, भले ही ऐपपूल रीसायकल हो।

ध्यान दें कि कैश ऑब्जेक्ट को पढ़ने/अपडेट करते समय आपके प्रश्न में कोड लॉक() का उपयोग करना चाहिए। अन्यथा, आपके पास संभावित दौड़ की स्थिति है।

संबंधित मुद्दे