2010-02-25 11 views
9

में स्टेटिक तरीके Ip.net-पृष्ठों के भीतर स्थिर तरीकों के बारे में थोड़ा उलझन में हैं। जैसे क्या होगा यदि मैं डेटाबेस से उपयोगकर्ताडेटा प्राप्त करने के लिए एक स्थिर डेटाबेस-विधि बना सकता हूं (UserDBHandler.getUser() जैसे कुछ) - क्या यह तरीका वेब-पेजों के भीतर से उस विधि को कॉल करना सुरक्षित है? क्या प्रत्येक पृष्ठ-कॉल के लिए बनाया गया कोई नया धागा नहीं है? और क्या HttpContext.Current हमेशा वर्तमान-उपयोगकर्ता संदर्भ को वापस करता है, तो क्या यह वर्तमान-उपयोगकर्ता सत्र प्राप्त करने के लिए स्थिर तरीकों से कॉल करना सुरक्षित है ??एएसपी.नेट

धन्यवाद

उत्तर

0

एक ही सत्र के दायरे मुझे विश्वास है कि आप एक ही धागे पर चल रहे हो जाएगा तो यह एक समस्या नहीं होनी चाहिए के भीतर।

8

यह वेब पेजों

सिर्फ अगर इस विधि reentrant है भीतर से कि विधि कॉल करने के लिए सुरक्षित है। एसक्यूएल के साथ उदाहरण:

public static User GetUser(string username) 
{ 
    using (var connection = new SqlConnection(ConnectionString)) 
    using (var command = connection.CreateCommand()) 
    { 
     connection.Open(); 
     command.CommandText = "select name, username from users where username = @username"; 
     command.Parameters.AddWithValue("@username", username); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       return new User 
       { 
        Username = username, 
        Name = reader.GetString(0), 
       } 
      } 
     } 
     return null; 
    } 
} 

और अपने ASPX पेज में कहते हैं:

var user = SomeClass.GetUser(Session["username"]); 

और HttpContext.Current हमेशा वर्तमान उपयोगकर्ताओं संदर्भ वापसी करता है, इसलिए इसे सुरक्षित कॉल करने के लिए से वह यह है कि मौजूदा सत्र प्राप्त करने के लिए स्थिर विधियां?

हां, HttpContext.Current वर्तमान HTTP संदर्भ प्राप्त करने के लिए सुरक्षित रूप से उपयोग किया जा सकता है। लेकिन मैं आपको अपने डीबी एक्सेस विधि में HttpContext.Current को कॉल नहीं करने का सुझाव दूंगा। बस तर्क के रूप में आवश्यकतानुसार पास करें ताकि विधि को कॉल करते समय आपका एएसपीएक्स पृष्ठ सत्र को सुरक्षित रूप से पढ़े और आवश्यक पैरामीटर पास कर सके।

टिप्पणी और व्यक्तिगत सलाह: डेटा एक्सेस के लिए स्थिर तरीकों का उपयोग न करें। स्थैतिक विधियों का उपयोग करके कॉलिंग कोड इकाई परीक्षण के लिए असंभव है।

+0

आपके उत्तर के लिए धन्यवाद! तो आपका GetUser-Method थ्रेड-सुरक्षित है? एक और सवाल: उपयोग-ब्लॉक के भीतर वापसी होने पर भी कनेक्शन बंद है? –

+0

नहीं, कनेक्शन बंद नहीं है। इसे पुन: उपयोग के लिए एडीओ.NET कनेक्शन पूल में वापस कर दिया गया है। –

0

यह इस बात पर निर्भर करता है कि विधि कैसे लिखी गई है। यदि विधि थ्रेड सुरक्षित तरीके से लिखी गई है, तो आपको कोई समस्या नहीं होनी चाहिए।

2

यह वेब पेजों

यह वास्तव में क्या आप विधि में क्या पर निर्भर करता है के भीतर से कि विधि कॉल करने के लिए सुरक्षित है। यह विधि शायद दुष्प्रभावों के बिना एक समारोह होनी चाहिए।

Isnt एक नया हर पेज-कॉल

हाँ के लिए बनाया धागा।

does HttpContext.Current always return the current-users context, so is it safe to call that from static methods to get the current-users session?? 

हां।

यदि आप एक शुद्धवादी बनना चाहते हैं, तो यह सलाह नहीं दी जाती है कि स्थिर विधियों पर भरोसा करें क्योंकि वे आपके कोड को अलगाव में परीक्षण करने के लिए कठिन बनाते हैं। यदि कक्षा ए कक्षा बी पर एक स्थिर विधि कहता है, तो आप कभी भी परीक्षण ए/परीक्षण बी के बिना कक्षा ए का परीक्षण करने में सक्षम नहीं होंगे।