2009-03-08 19 views
19

मैंने सभी संबंधित प्रश्नों के माध्यम से पढ़ा है, लेकिन मैं अभी भी किसी कारण से सही समाधान प्राप्त करने में असमर्थ हूं, मेरे पक्ष में कुछ सही नहीं है, लेकिन यह सुनिश्चित नहीं है कि इसका क्या कारण है।मैं एक कस्टम सदस्यता प्रदाता पर आरंभ कैसे कॉल करूं?

public override void Initialize(string name, NameValueCollection config) 
{ 
    if (config == null) 
    { throw new ArgumentNullException("config"); } 

    if (string.IsNullOrEmpty(name)) 
    { name = "MyMemberShipProvider"; } 

    if (string.IsNullOrEmpty(config["description"])) 
    { 
     config.Remove("description"); 
     config.Add("description", "My Membership Provider"); 
    } 

    base.Initialize(name, config); 

    _applicationName = GetConfigValue(config["applicationName"], System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath); 
    _maxInvalidPasswordAttempts = Convert.ToInt32(GetConfigValue(config["maxInvalidPasswordAttempts"], "5")); 
    _passwordAttemptWindow = Convert.ToInt32(GetConfigValue(config["passwordAttemptWindow"], "10")); 
    _minRequiredNonAlphaNumericCharacters = Convert.ToInt32(GetConfigValue(config["minRequiredAlphaNumericCharacters"], "1")); 
    _minRequiredPasswordLength = Convert.ToInt32(GetConfigValue(config["minRequiredPasswordLength"], "7")); 
    _passwordStregthRegularExpression = Convert.ToString(GetConfigValue(config["passwordStrengthRegularExpression"], String.Empty)); 
    _enablePasswordReset = Convert.ToBoolean(GetConfigValue(config["enablePasswordReset"], "true")); 
    _enablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["enablePasswordRetrieval"], "true")); 
    _requiredQuestionAndAnswer = Convert.ToBoolean(GetConfigValue(config["requiresQuestionAndAnswer"], "false")); 
    _requiredUniqueEmail = Convert.ToBoolean(GetConfigValue(config["requiresUniqueEmail"], "true")); 

    string temp_format = config["passwordFormat"]; 
    if (temp_format == null) 
    { 
     temp_format = "Hashed"; 
    } 

    switch (temp_format) 
    { 
     case "Hashed": 
      _passwordFormat = MembershipPasswordFormat.Hashed; 
      break; 
     case "Encrypted": 
      _passwordFormat = MembershipPasswordFormat.Encrypted; 
      break; 
     case "Clear": 
      _passwordFormat = MembershipPasswordFormat.Clear; 
      break; 
     default: 
      throw new ProviderException("Password format not supported."); 
    } 

    ConnectionStringSettings _connectionStringSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]]; 

    if (_connectionStringSettings == null || _connectionStringSettings.ConnectionString.Length == 0) 
    { 
     throw new ProviderException("Connection String Cannot Be Blank."); 
    } 

    _connectionString = _connectionStringSettings.ConnectionString; 

    //Get Encryption and Decryption Key Information From the Information. 

    System.Configuration.Configuration cfg = WebConfigurationManager.OpenWebConfiguration(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath); 
    _machinekey = cfg.GetSection("system.web/machineKey") as MachineKeySection; 

    if (_machinekey.ValidationKey.Contains("AutoGenerate")) 
    { 
     if (PasswordFormat != MembershipPasswordFormat.Clear) 
     { 
      throw new ProviderException("Hashed or Encrypted passwords are not supported with auto-generated keys."); 
     } 
    } 

} 

और मैं को आरम्भ देखा है:

<membership defaultProvider="MyMemberShipProvider"> 
     <providers> 
     <clear /> 
     <add name="MyMemberShipProvider" 
        type="MyNameSpace.MyMemberShipProvider" 
        connectionStringName="ApplicationServices" 
        enablePasswordRetrieval="false" 
        enablePasswordReset="true" 
        requiresQuestionAndAnswer="false" 
        requiresUniqueEmail="false" 
        passwordFormat="Hashed" 
        maxInvalidPasswordAttempts="5" 
        minRequiredPasswordLength="6" 
        minRequiredNonalphanumericCharacters="0" 
        passwordAttemptWindow="10" 
        passwordStrengthRegularExpression="" 
        applicationName="MyApplication" /> 
     </providers> 
    </membership> 

यहाँ मेरी प्रारंभ विधि के लिए कोड है:

मैं एक कस्टम सदस्यता प्रदाता बनाया है, यह भी करने के लिए अपने web.config बदल विधि को नहीं बुलाया गया था, मैंने यहां प्रश्नों के माध्यम से पढ़ा और लोग कह रहे थे कि मुझे मैन्युअल रूप से कॉल करने की ज़रूरत नहीं है, अगर मैंने अपना वेब.कॉन्फिग सही तरीके से तारित किया है, तो मुझे कुछ भी करने की ज़रूरत नहीं है, लेकिन मैंने कोशिश की मैन्युअल रूप से कॉल करें, लेकिन जब मैंने कोशिश की तो मुझे एक अमान्यकास्ट अपवाद दिया नाम ValueCollection डालने के लिए जी।

क्या कोई मेरी मदद कर सकता है? धन्यवाद

उत्तर

3

यह सच है अपने प्रारंभ विधि इतने लंबे समय के रूप में अपने प्रदाता सही तरीके से कॉन्फ़िगर स्वचालित रूप से बुलाया जाना चाहिए (क्योंकि यह अपने कोड नमूने में हो रहा है)।

आप की आवश्यकता होगी स्पष्ट करने के लिए कैसे आप 'इसे मैन्युअल रूप से कहा जाता है', और जहाँ आप NameValueCollection कास्ट करने के लिए कोशिश की। क्या यह प्रारंभ में हुआ था?

शायद आप हमें अपने प्रारंभ विधि दिखाया जाना चाहिए (आप भूल जाते हैं नहीं किया override कीवर्ड, तुमने किया था ;-)

संपादित करें:? ठीक है, प्रारंभ विधि भी ठीक लगता है।

ध्यान रखें: Membership एक स्थिर वर्ग है, और यह कॉन्फ़िगर प्रदाताओं को आलसी तरीके से लोड और प्रारंभ करता है। तो अपने प्रदाता के निर्माण, और अपने Initialize विधि करने के लिए कॉल, जब तक एक कॉल या तो Membership.Provider या Membership.Providers संपत्ति के लिए किया जाता है घटित नहीं होगा। अन्य सभी स्थिर तरीकों (जैसे कि GetUser()) यह करेंगे, लेकिन निष्कर्ष यह है कि आपकी प्रारंभिक विधि तब तक नहीं बुलाई जाएगी जब तक सदस्यता API वास्तव में उपयोग नहीं किया जाता है।

आप या तो स्पष्ट या एक लॉग इन पर नियंत्रण या उस तरह का उपयोग करके यह, किया है?

+0

मैंने पहले से ही अपने प्रश्न पर प्रारंभिक कोड डाला है, और मैंने कीवर्ड को ओवरराइड किया है, और यह आग नहीं है, सुनिश्चित नहीं है कि क्यों। – PlayKid

+0

आप सही हैं, यह स्थिर है, इस मामले में सिंगलटन नहीं, मैं अपनी पोस्ट संपादित करूंगा। धन्यवाद! –

1

मूल रूप से प्रवाह इस तरह चला जाता है,

सदस्यता वर्ग (एक स्थिर वर्ग) कॉल और MembershipProvider (एक अमूर्त वर्ग ProviderBase से प्राप्त) जो SqlMembershipProvider औजार (अपने मामले MyMemberShipProvider में), इस प्रकार आप अपने कार्यान्वयन दिया का उपयोग करता है MyMemberShipProvider में आपके डेटा स्रोत पर कोड तक पहुंचने वाले डेटा का, लेकिन आप स्वयं को प्रारंभ करने के लिए कॉल नहीं करते हैं।

Initialize(), ProviderBase पर आभासी तरीका है जब आप अपने MyMemberShipProvider बनाने आप की तरह इसे ओवरराइड

class MyMemberShipProvider : MembershipProvider 
{ 
    private string _connectionStringName; 

    public override void Initialize(string name, NameValueCollection config) 
    { 
     // see the config parameter passed in is of type NameValueCollection 
     // it gives you the chance to get the properties in your web.config 
     // for example, one of the properties is connectionStringName 

     if (config["connectionStringName"] == null) 
     { 
      config["connectionStringName"] = "ApplicationServices"; 
     } 
     _connectionStringName = config["connectionStringName"]; 
     config.Remove("connectionStringName");   
    } 
} 
अपने कोड को देखने के बिना

, जब आप कहते हैं एक अपवाद NameValueCollection से कोई लेना देना नहीं है, यह है नीचे मुझे ऊपर इस विधि की याद दिलाता है।

आशा इस मदद करता है, रे।

+0

मैंने अपने प्रश्न पर अपना कोड शामिल किया है, यह आपके जैसा ही है, लेकिन समस्या यह कभी आग नहीं है। – PlayKid

+0

असल में, सदस्यता एक सिंगलटन नहीं है - यह स्थिर है। –

+0

आप सही हैं, यह स्थिर है, इस मामले में सिंगलटन नहीं, मैं अपनी पोस्ट संपादित करूंगा। धन्यवाद! –

0

कस्टम सदस्यता प्रदाता स्वचालित रूप से आरंभ नहीं हो जाता और यह बहुत मैन्युअल रूप से करना करने के लिए इरादा नहीं है।

मेरी कार्यान्वयन में, वहाँ प्रारंभ नीचे की तरह metod है:

public override void Initialize(string name, NameValueCollection config) 
{ 
    if (config == null) 
     throw new ArgumentNullException("config"); 


    // Initialize the abstract base class. 
    base.Initialize(name, config); 
} 

ध्यान रखें, कि base.Initialize विधि ProviderBase वर्ग जो निम्न अपवादों परिभाषित में है:

अपवाद:

  • सिस्टम। ऑर्ग्यूमेंट नल अपवाद: प्रदाता का नाम शून्य है।
  • सिस्टम। ऑर्ग्यूमेंट अपवाद: प्रदाता का नाम शून्य की लंबाई है।

  • System.InvalidOperationException: का प्रयास के बाद प्रदाता पहले से ही शुरू कर दिया गया एक प्रदाता पर System.Configuration.Provider.ProviderBase.Initialize (System.String, System.Collections.Specialized.NameValueCollection) कॉल करने के लिए किया जाता है ।

पिछले अपवाद एक तुम नहीं है?

+0

नहीं है, समस्या प्रारंभ आग है नहीं था, इसलिए मैं क्या किया मैं सार्वजनिक MyMembershipProvider() के रूप में एक विधि रख दिया और यह काम है, लेकिन मुझे लगता है कि करने के लिए सही रास्ता है नहीं लगता। – PlayKid

+0

यकीन है, तो आप अपने web.config में निम्नलिखित हैं: प्रकार = "MyNameSpace.MyMemberShipProvider, MyNamespace" : <सदस्यता defaultProvider = "MyMemberShipProvider"> – twk

+0

सुनिश्चित करें, आप 'प्रकार' विशेषता 2 भागों शामिल है जहां "MyNameSpace" आपके प्रदाता वर्ग का डीएलएल नाम है। – twk

2

मैं बाहर काम करने के आप क्या किया है कोशिश कर रहा हूँ .... मुझे लगता है कि आप इस प्रकार आगे बढ़ गए,:

  • MembershipProvider से इनहेरिट
  • कॉन्फ़िगर web.config (द्वारा MyMembershipProvider नामक कस्टम वर्ग बनाया गया मेरे लिए सही)
  • एक वेब नियंत्रण है कि एक गतिविधि सक्रिय कुछ करने के लिए बनाया गया लग रहा है (उदाहरण के लिए इस घटना के भीतर एक लॉगिन प्रमाणित करने के लिए) फिर ...
  • , तो आप इस और wond की तरह कुछ करने की कोशिश की है ering क्यों शुरू करें() को आपके कोड के माध्यम से कदम उठाने के दौरान नहीं कहा जाता है:

    MyNameSpace.MyMemberShipProvider msp = new MyNameSpace.MyMemberShipProvider();
    बूल IsAuthorised = msp.ValidateUser (txtLogin, txtPass);

समाधान: - यह बजाय का उपयोग करें:

bool IsAuthorised = Membership.ValidateUser(txtLogin, txtPass); 
  • खुद करके अपनी कक्षा का एक उदाहरण बनाने मत करो, बजाय सदस्यता स्थिर वर्ग का उपयोग करके नेट आप के लिए ऐसा करते हैं , जो सुनिश्चित करता है कि MyMemberShipProvider का केवल एक उदाहरण एप्लिकेशन के पूरे जीवनकाल में मौजूद है। यदि आप अपनी खुद की कक्षा को तुरंत चालू करते हैं और प्रारंभ() को कॉल करते हैं, तो आपका कोड थ्रेड सुरक्षित नहीं होगा।
46

आरंभ करने के लिए() को कॉल करने के लिए, आपको अपने कस्टम सदस्यता प्रदाता को एक निश्चित तरीके से तुरंत चालू करने की आवश्यकता होगी। इसलिए जैसा:

MyCustomMembershipProvider myProvider = (MyCustomMembershipProvider)Membership.Providers["NameOfMembershipProviderInConfig"]; 

अब जब आप अपने कस्टम प्रदाता से myProvider, प्रारंभ() का उपयोग बुलाया जाएगा।

+3

+1 धन्यवाद। बाहरी परियोजना से सदस्यता तक पहुंचने के इच्छुक लोगों के लिए, सदस्यता System.Web.Security से संबंधित है, और सिस्टम.Web.dll की आवश्यकता है। – CRice

+0

और बस अतिरिक्त स्पष्टता के लिए, "NameOfMembershipProviderInConfig" वास्तव में अपने MembershipProvider कॉन्फ़िग फ़ाइल प्रवेश की "नाम" संपत्ति से मेल खाना चाहिए। मैंने गलती से "प्रकार" संपत्ति का मूल्य रखा था और नहीं जाना था। –

0

इस बलों इनिशियलाइज़ कोड एक प्रदाता प्रारंभ करने में किया जाता है

private readonly Provider _provider; 

public AccountMembershipService(Provider provider) 
{ 
    _provider = provider ?? (Provider) Membership.Provider; 
} 
0

यहाँ के नाम से जाना:

   System.Collections.Specialized.NameValueCollection adProviderConfig; 
       adProviderConfig = membershipSection.Providers[adProviderName].Parameters; 
       var _ADProvider = new ActiveDirectoryMembershipProvider(); 
       _ADProvider.Initialize(adProviderName, adProviderConfig); 
1

मैं इस Initialize() विधि के साथ कुछ समय पहले एक समस्या थी, मैं लूंगा इसे यहां पोस्ट करें यह किसी के लिए सहायक हो सकता है।

मान लें कि आप अपने कस्टम प्रदाता के कार्यान्वयन है:

MyEnterprise.MyArea.MyProviders.CustomProvider 

और क्या आप चाहते विधि GetUserNameByEmail जो प्रदाता कार्यान्वयन के अंदर है का उपयोग करें। इस विधि कॉल करने के दो तरीके, के माध्यम से कर रहे हैं: जो प्रारंभ विधि सक्रिय नहीं होगा के रूप में आप यह अपने आप से बुला रहे हैं

MyEnterprise.MyArea.MyProviders.CustomProvider.GetUserNameByEmail(email) 

, दूसरे हाथ पर अपने कॉल है यदि:

Membership.GetUserNameByEmail(email) 

यदि आवश्यक हो तो प्रारंभिक विधि को बुलाया जाएगा, मुझे लगता है कि यह आधार निर्माता या कुछ (अधिक खोला नहीं गया) पर है।

उम्मीद है कि इससे मदद मिलती है। - ई

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