我有一个带有自定义httpModule的WCF Web服务,该服务用于对MysqlMembership进行UserName / Password身份验证。
public void Init(HttpApplication application)
{
application.AuthenticateRequest += new EventHandler(this.OnAuthenticateRequest);
application.EndRequest += new EventHandler(this.OnEndRequest);
}
public void OnAuthenticateRequest(object source, EventArgs eventArgs)
{
...
...
if (Membership.ValidateUser(username, password))
{
当我开始对服务进行负载测试时,遇到了一个令人困惑的问题。请求随机失败Membership.ValidateUser调用。我在负载测试器中为每个线程使用相同的用户名/登录名。这是错误:
[MySqlException (0x80004005): Deadlock found when trying to get lock; try restarting transaction]
MySql.Data.MySqlClient.MySqlStream.ReadPacket() +506
MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId) +450
MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +131
MySql.Data.MySqlClient.MySqlDataReader.NextResult() +1216
MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +2191
MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() +27
MySql.Web.Security.MySQLMembershipProvider.ValidateUser(String username, String password) +1092
[ProviderException: An exception occurred. Please check the Event Log.]
MySql.Web.Security.MySQLMembershipProvider.ValidateUser(String username, String password) +1481
MyApplication.UserAuthenticator.UserNameAuthenticator.OnAuthenticateRequest(Object source, EventArgs eventArgs) in C:\Develop\MyProject\MyProject.UserAuthenticator\UserNameAuthenticator.cs:123
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270
有任何想法吗?
谢谢,
轻拂
最佳答案
如果密码无效,验证用户将锁定该行以增加无效的密码尝试次数:
如果为ValidateUser方法提供了错误的密码,则
跟踪无效密码尝试的内部计数器增加
一个。这可能导致用户被锁定并且无法登录
亮起,直到通过调用UnlockUser清除锁定状态为止
方法。如果提供了正确的密码而用户没有
当前锁定,然后跟踪无效的内部计数器
密码和密码应答尝试重置为零。欲了解更多
有关信息,请参见MaxInvalidPasswordAttempts和
PasswordAttemptWindow属性。
http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.validateuser.aspx
由于您对所有请求使用同一用户,因此可能会出现死锁。