6

समस्या Membership.GetUser ठीक काम करता है अगर मैं GUID उपयोग करें, लेकिन अगर मैं इसे पैरामीटर के बिना या नाम के साथ की कोशिश में विफल रहता है:SqlMembershipProvider Membership.GetUser नाम में नाकाम रहने से

//This works and adds records to aspnet_user & aspnet_Membership tables 
MembershipUser membershipUser = Membership.CreateUser(_name, _pwd, _email, null, null, true, null, out createStatus); 

//These fail with an InvalidCastException 
MembershipUser membershipUser2 = Membership.GetUser(_name, true); 
MembershipUser membershipUser3 = Membership.GetUser(); 

//If I go look up the GUID for this user (userId), this works! 
MembershipUser membershipUser4 = Membership.GetUser(new Guid("E1428CD3-CF17-494E-AB77-CF8F6010F585"), true); 

अन्य रहस्य

//This works 
Int32 count = Membership.GetNumberOfUsersOnline();  

//this fails (but totalRecords has the right value) 
Int32 totalRecords; 
MembershipUserCollection col = Membership.GetAllUsers(0,100, out totalRecords); 

सेटअप

  • MVC
  • .NET 4.0
  • डिफ़ॉल्ट एसक्यूएल सदस्यता प्रदाता (कोई कस्टम या ओवरराइड)

पूर्व:

<membership defaultProvider="SqlProvider"> 
    <providers> 
     <clear /> 
     <add name="SqlProvider" 
      type="System.Web.Security.SqlMembershipProvider" 
      connectionStringName="MyDB" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      applicationName="myapp" 
      requiresUniqueEmail="false" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="5" 
      minRequiredPasswordLength="2" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression="" /> 
    </providers> 
</membership> 
  • स्टैंडर्ड aspnet_ * कोई अनुकूलन के साथ डेटाबेस तालिकाओं या अतिरिक्त कुंजी
  • aspnet_Membership_GetAllUsers r डीबी से मैन्युअल रूप से ठीक नहीं है। रीडायरेक्ट किए जाने वाले उत्पादन की उम्मीद परिणाम नहीं दिए जा रहा है पता चलता है
  • aspnet_Membership_GetUserByName डीबी

अपवाद से अच्छी तरह से काम कर रहा है विवरण

Specified cast is not valid. 
    at System.Data.SqlClient.SqlBuffer.get_SqlGuid() 
    at System.Data.SqlClient.SqlDataReader.GetGuid(Int32 i) 
    at System.Web.Security.SqlMembershipProvider.GetUser(String username, Boolean userIsOnline) 
    at System.Web.Security.Membership.GetUser(String username, Boolean userIsOnline) 

विचार

यह वहाँ कुछ गड़बड़ है लगभग की तरह है सदस्यता के अंदर। गेट यूज़र विधि। मैं अपने System.Web.dll (संस्करण 4.0) के लिए System.Web.Security.SqlMembershipProvider.GetUser के लिए कोड बाहर परिलक्षित और मैं निम्नलिखित मिल:

public override MembershipUser GetUser(string username, bool userIsOnline) 
{ 
    SecUtility.CheckParameter(ref username, true, false, true, 256, "username"); 
    SqlDataReader reader = (SqlDataReader) null; 
    try 
    { 
    SqlConnectionHolder connectionHolder = (SqlConnectionHolder) null; 
    try 
    { 
     connectionHolder = SqlConnectionHelper.GetConnection(this._sqlConnectionString, true); 
     this.CheckSchemaVersion(connectionHolder.Connection); 
     SqlCommand sqlCommand = new SqlCommand("dbo.aspnet_Membership_GetUserByName", connectionHolder.Connection); 
     sqlCommand.CommandTimeout = this.CommandTimeout; 
     sqlCommand.CommandType = CommandType.StoredProcedure; 
     sqlCommand.Parameters.Add(this.CreateInputParam("@ApplicationName", SqlDbType.NVarChar, (object) this.ApplicationName)); 
     sqlCommand.Parameters.Add(this.CreateInputParam("@UserName", SqlDbType.NVarChar, (object) username)); 
     sqlCommand.Parameters.Add(this.CreateInputParam("@UpdateLastActivity", SqlDbType.Bit, (object) (bool) (userIsOnline ? 1 : 0))); 
     sqlCommand.Parameters.Add(this.CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, (object) DateTime.UtcNow)); 
     SqlParameter sqlParameter = new SqlParameter("@ReturnValue", SqlDbType.Int); 
     sqlParameter.Direction = ParameterDirection.ReturnValue; 
     sqlCommand.Parameters.Add(sqlParameter); 
     reader = sqlCommand.ExecuteReader(); 
     if (!reader.Read()) 
     return (MembershipUser) null; 
     string nullableString1 = this.GetNullableString(reader, 0); 
     string nullableString2 = this.GetNullableString(reader, 1); 
     string nullableString3 = this.GetNullableString(reader, 2); 
     bool boolean1 = reader.GetBoolean(3); 
     DateTime creationDate = reader.GetDateTime(4).ToLocalTime(); 
     DateTime lastLoginDate = reader.GetDateTime(5).ToLocalTime(); 
     DateTime lastActivityDate = reader.GetDateTime(6).ToLocalTime(); 
     DateTime lastPasswordChangedDate = reader.GetDateTime(7).ToLocalTime(); 
     Guid guid = reader.GetGuid(8); 
     bool boolean2 = reader.GetBoolean(9); 
     DateTime lastLockoutDate = reader.GetDateTime(10).ToLocalTime(); 
     return new MembershipUser(this.Name, username, (object) guid, nullableString1, nullableString2, nullableString3, boolean1, boolean2, creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, lastLockoutDate); 
    } 
    finally 
    { 
     if (reader != null) 
     reader.Close(); 
     if (connectionHolder != null) 
     connectionHolder.Close(); 
    } 
    } 
    catch 
    { 
    throw; 
    } 
} 

अगला कदम

मैं मैं एसओ भीड़ से कुछ दिशा पाने की उम्मीद कर रहा हूं जहां मुझे आगे जाना चाहिए। मुझे लगता है कि मैं या तो इस विधि को ओवरराइड कर सकता हूं और इसे अपने स्वयं के प्रदाता को सिर्फ डीबग करने के लिए रख सकता हूं, या मैं सिर्फ डर्न की गई चीज़ के आसपास जा सकता हूं और डीबी को सीधे कॉल कर सकता हूं। यह कुछ बुनियादी डीबी सीआरयूडी से बहुत दिल का दर्द लगता है।

वर्तमान स्थिति

  • 3/5/2013: मैं आज सुबह कि मेरे aspnet_Users तालिका एक uniqueidentifier के बजाय एक nvarchar(256) रूप UserId है की खोज की। शायद SqlDataReader.GetGuid() वहां चकित हो रहा है। मैं इस शाम को कुछ परीक्षण चलाऊंगा यह देखने के लिए कि क्या यह समस्या है। मैं सोच रहा हूं कि मेरी तालिका संरचना पुरानी है, क्योंकि ऑनलाइन दस्तावेज इस क्षेत्र को uniqueidentifier के रूप में दिखाता है।
+0

यह कैसे विफल हो जाता है? अपवाद विवरण कृपया। –

+0

जोड़ा गया अपवाद विवरण। रेखा: System.Data.SqlClient.SqlDataReader.GetGuid (Int32 i) निश्चित रूप से अजीब लगता है। – maulkye

+0

इसके अलावा, यदि आप कोड को अंतर्दृष्टि के लिए "परावर्तित"/रिवर्स-इंजीनियर/डिकंपाइल-इन करने के लिए जा रहे हैं, तो आपको स्थिर सदस्यता वर्ग - सदस्यता.गेटयूसर() - पर GetUser() विधि को देखना चाहिए। वह जगह है जहां वर्तमान उपयोगकर्ता की पहचान के बारे में धारणाएं की जा रही हैं। GetUser() मानता है कि यह एक वेब अनुप्रयोग में वर्तमान उपयोगकर्ता के बारे में विस्तार प्राप्त कर रहा है –

उत्तर

1

उत्तर

मेरे aspnet_User और aspnet_Membership टेबल nvarchar(256) का एक प्रकार के UserId सेट था।

चर्चा

यह SqlMembershipProvider.GetUser विधि से निम्न पंक्ति के दौरान त्रुटि उत्पन्न कर गया प्रतीत होता है:

Guid guid = reader.GetGuid(8); 

मैं दोनों नेट चौखटे 2 और 4 से aspnet_regsql.exe भाग गया , और दोनों ने UserId को एक अनूठा पहचानकर्ता के रूप में सेट किया, जिससे मुझे लगता है कि मैंने (मानक के बाद) मानक एएसपीएनईटी डीबी नहीं किया है।

परियोजना के इतिहास में एक छोटी सी खुदाई पता चलता है कि इस सदस्यता डेटाबेस मूल रूप MySql के लिए एक कस्टम प्रदाता के माध्यम से उत्पन्न किया गया था। मैं केवल यह निष्कर्ष निकाल सकता हूं कि जब हम डिफ़ॉल्ट प्रदाता पर वापस स्विच करते हैं तो इसे कभी पुन: उत्पन्न नहीं किया जाता था।

उनके प्रतिक्रिया के लिए सभी को धन्यवाद।

1

आप membership.CurrentUserName() का उपयोग क्यों करते हैं?तुम बस का उपयोग कर सकते HttpContext.Current.User.Identity.Name;

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