2013-01-08 16 views
10

मैं यह सुनिश्चित करना चाहता हूं कि मेरी वेबसाइट भविष्य में क्लाउड पर होस्ट करने में सक्षम है और यह भी कि कई अनुरोधों को संभाल सकता है।एएसपी.नेट एमवीसी स्थैतिक चर कितने सुरक्षित हैं

स्थैतिक चर कितने सुरक्षित हैं?

क्या वे असुरक्षित हैं क्योंकि अलग-अलग उपयोगकर्ताओं द्वारा अलग-अलग अनुरोध वास्तव में इन स्थिर चर साझा कर रहे हैं? या ऐसा इसलिए है क्योंकि यदि आप साइट को थ्रेड/शेर्डिंग या इसी तरह से फैलाते हैं, (उच्च लोड को संभालने के लिए) धागे स्थिर चर साझा कर रहे हैं?

मुख्य रूप से मेरे पास स्थिर गुणों के साथ सहायक वर्ग हैं, क्या मुझे इस आर्किटेक्चर को बदलना चाहिए ताकि मैं प्रत्येक वर्ग का उदाहरण बना सकूं और उदाहरणों तक पहुंच सकूं?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Mvc.Mailer; 

namespace MVCWebsite.Helpers 
{ 
     public class AppSettings 
     { 
       public static void OnAppInit() 
       { 
         //General 
         AppName = "MyApp"; 
         DesktopBaseURLs = new Dictionary<string, string>(); 
         DesktopBaseURLs.Add("dev", "localhost:50560"); 
         DesktopBaseURLs.Add("test", "www.test.whatever.com"); 
         DesktopBaseURLs.Add("live", "www.whatever.com"); 
         MobileBaseURLs = new Dictionary<string, string>(); 
         MobileBaseURLs.Add("dev", "m.local.whatever.com"); 
         MobileBaseURLs.Add("test", "m.test.whatever.com"); 
         MobileBaseURLs.Add("live", "m.whatever.com"); 

         //Emails 
         EmailHostName = AppName + ".com"; //For the moment atleast 
         NoReplyEmailAddress = "[email protected]" + EmailHostName.ToLower(); 
         SupportEmailAddress = "[email protected]" + EmailHostName.ToLower(); 
         ErrorEmailAddress = "[email protected]" + EmailHostName.ToLower(); 

         //Resources 
         TempFileURL = "/content/temp/"; 
         UserDataURL = "/content/user-content/"; 
         ProfilePicturesURL = UserDataURL + "profile-pictures/"; 

         var a = GlobalHelper.GetURLAsServerPath(ProfilePicturesURL); 
         var b = a; 

       } 

       //General 
       public static string AppName { get; set; } 
       public static Dictionary<string, string> DesktopBaseURLs; 
       public static Dictionary<string, string> MobileBaseURLs; 

       //Emails 
       public static string EmailHostName { get; set; } 
       public static string NoReplyEmailAddress { get; set; } 
       public static string SupportEmailAddress { get; set; } 
       public static string ErrorEmailAddress { get; set; } 

       //Resources 
       public static string UserDataURL { get; set; } 
       public static string TempFileURL { get; set; } 
       public static string ProfilePicturesURL { get; set; } 

       //Methods 
       public static void SetAppURL() 
       { 

       } 
     } 
} 
+0

समान नियम लागू होते हैं ... स्थैतिक ऐप डोमेन के भीतर साझा किया जाता है। साझा कॉन्फ़िगरेशन डेटा (जैसा कि आपके उदाहरण में है) के लिए, यह वही हो सकता है जो आप चाहते हैं, लेकिन केवल एक बार, और एक थ्रेड से प्रारंभ करने के लिए सावधानी बरतें। –

उत्तर

15

आपका कोड थ्रेड सुरक्षित नहीं है। आप एकाधिक अनुरोधों के बीच स्थैतिक चर साझा कर रहे हैं जो संभावित रूप से एकाधिक धागे द्वारा निष्पादित किया जा सकता है। ध्यान रखें कि Dictionary<TKey, TValue> कक्षा जिसे आप अंतर्निहित भंडारण के रूप में उपयोग कर रहे हैं वह थ्रेड सेफ क्लास नहीं है जिसका अर्थ है कि यदि आप OnAppInit विधि को एकाधिक थ्रेड से कॉल करने का प्रयास करते हैं तो आपका कोड संभावित रूप से बहुत बुरी तरह दुर्घटनाग्रस्त हो सकता है। यदि दूसरी ओर आप अपने 0_स्थिर विधि को केवल अपने एप्लिकेशन_स्टार्ट ईवेंट (जिसे केवल एक थ्रेड से केवल एक बार चलाने की गारंटी है) के अंदर कॉल कर रहे हैं, तो आप इसे वहां उपयोग करने के लिए बहुत सुरक्षित हैं।

यह कहा जा रहा है कि स्थिर चर और विधियां आमतौर पर अनुप्रयोगों में एक बुरा विचार सच नहीं है। यदि आप नहीं जानते कि उन्हें सही तरीके से उपयोग कैसे किया जाए, या यदि आपको समवर्ती धागे से ऐसा करने की आवश्यकता है, तो उन्हें एक्सेस सिंक्रनाइज़ करने का तरीका नहीं है, तो वे एक बुरे विचार हैं। थ्रेड-सुरक्षित कोड लिखना एक बहुत ही कठिन विषय है और यदि आपको यह गलत बनाने का डर है (जो एएसपी.NET एप्लिकेशन जैसे बहुप्रचारित अनुप्रयोगों को लिखते समय नहीं है?) बस इस तरह की स्थिति साझा न करें। ASP.NET अनुप्रयोग में इस के लिए अच्छी तरह से स्थापित स्थानों का उपयोग करें:

  • बैकएंड
  • एप्लिकेशन स्थिति
  • कैश
  • Http संदर्भ राज्य
  • सत्र स्थिति (उदाहरण के लिए एक संबंधपरक डेटाबेस हो सकता है)
  • क्लाइंट कुकीज़
उन स्थानों

specifica हैं एक एएसपी.NET आवेदन में राज्य को संग्रहीत करने के लिए डिलीवरी किया गया है (पाठ्यक्रम के पहले एक को छोड़कर जिसे किसी भी प्रकार के एप्लिकेशन में इस्तेमाल किया जा सकता है)।

+0

क्या आप थोड़ा और समझा सकते हैं ... आपका क्या मतलब है "यदि आप कई धागे से एक साथ OnAppInit विधि को कॉल करने का प्रयास करते हैं तो आपका कोड संभावित रूप से बहुत बुरी तरह दुर्घटनाग्रस्त हो सकता है"? इस विधि के साथ वास्तव में क्या गलत हो सकता है? – Dmitry

+3

वैसे यह विधि स्थानीय स्थैतिक चर को संशोधित कर रही है जो टाइप प्रकार का है। जैसा कि मैंने अपने जवाब में कहा था कि यह प्रकार ** थ्रेड-सुरक्षित ** नहीं है।तो उदाहरण के लिए पहला थ्रेड शब्दकोश के लिए कुछ मान निर्दिष्ट करेगा और इसमें मूल्य जोड़ने शुरू कर देगा जब कोई अन्य थ्रेड इसे केवल नए धागे को असाइन कर देगा जो पहले थ्रेड को अब तक सहेजा गया हो। इस कोड को कई धागे से कभी नहीं बुलाया जाना चाहिए। –

+0

धन्यवाद फिर से डारिन! फिर मैं या तो आसानी से पहुंचने के लिए वैश्विक ऑब्जेक्ट में बनाए गए उदाहरणों को संग्रहीत करूंगा या मेरे पास प्रत्येक कक्षा में एक स्थिर गेट() विधियां होंगी जो एकमात्र उदाहरण लौटाती हैं। इसे ठीक करना चाहिए। :) – Baconbeastnz

2

स्थैतिक चर अनुरोधों के बीच साझा किया जाएगा:

e.g यहाँ मैं क्या कर रहा हूँ का एक नमूना है। इसके अलावा, जब एप्लिकेशन शुरू होता है, तो उन्हें प्रारंभ किया जाएगा, इसलिए यदि ऐपडोमेन, इस प्रकार एप्लिकेशन को पुनरारंभ किया जाता है, तो उनके मान पुन: प्रारंभ किए जाएंगे।

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