sorun Membership.GetUser ben GUID kullanırsanız gayet iyi çalışıyor, ama parametreler olmadan veya adla çalışırsanız başarısız: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);
Diğer Gizemler
//This works
Int32 count = Membership.GetNumberOfUsersOnline();
//this fails (but totalRecords has the right value)
Int32 totalRecords;
MembershipUserCollection col = Membership.GetAllUsers(0,100, out totalRecords);
Kur
- MVC
- .NET 4.0
- Standart SQL üyelik sağlayıcısı (hiçbir özel ya da geçersiz kılar)
örn:
<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>
- Standart aspnet_ * hiçbir özelleştirme ile veritabanı tabloları veya fazla anahtarlar
- aspnet_Membership_GetAllUsers r DB'den el ile düzgün değil. Yönlendirilen çıktı beklenen sonuçlar
- aspnet_Membership_GetUserByName Detayları DB
Exception kaynağından sıra çalışıyor iade ediliyor gösterir
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)
Düşünceler
Yanlış bir şey var neredeyse gibi Membership.GetUser yönteminin içinde. Benim System.Web.dll (sürüm 4.0) için System.Web.Security.SqlMembershipProvider.GetUser için kod dışarı yansıyan ve aşağıdaki alıyorum:
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;
}
}
Sonraki Adım Ben
Bundan sonra gitmem gereken yerdeki SO kalabalıktan bir yön bulmayı umuyorum. Ya bu yöntemi geçersiz kılabileceğimi ve sadece kendi hata ayıklamak için kendi sağlayıcımı bir araya getirebileceğimi ya da sadece daralan şeyi dolaşabileceğimi ve doğrudan DB'ye seslenebileceğimi düşünüyorum. Bu bazı temel DB CRUD'larından çok fazla kalp ağrısı gibi görünüyor.
- 3/5/2013
Mevcut Durum: Benim
aspnet_Users
tablo yerineuniqueidentifier
birnvarchar(256)
olarakUserId
sahip bu sabah keşfetti. Belki deSqlDataReader.GetGuid()
orada boğuluyor. Bu akşam sorun olup olmadığını görmek için bazı testler yapacağım. Tablo yapmamın eski olup olmadığını merak ediyorum, çünkü çevrimiçi belgeler bu alanıuniqueidentifier
olarak gösteriyor.
Bu nasıl başarısız? İstisna Detayları lütfen. –
İstisna ayrıntıları eklendi. Satır: System.Data.SqlClient.SqlDataReader.GetGuid (Int32 i) emin tuhaf görünüyor. – maulkye
Ayrıca, "yansıtacak"/ters-mühendislik/kod çözme için kod için gidecekseniz, statik Üyelik sınıfında GetUser() yöntemine bakmanız gerekir - Membership.GetUser() - it Mevcut kullanıcının kimliği ile ilgili varsayımların yapıldığı yer. GetUser(), bir web uygulaması –