在阅读之前,请注意,我已经在谷歌上搜索了这篇文章,并阅读了大量关于SO和其他地方的文章,到目前为止还没有任何建议。
当我登录到MVC 3应用程序时,我随机收到一个超时错误。这种情况发生的时间远远超过一半——其他所有时间应用程序登录都很好。当它不起作用时,它会尝试大约10秒,然后出错。
错误:
异常:"执行命令定义时出错。有关详细信息,请参阅内部异常。"内部异常:{"超时已过期。超时时间在完成操作之前已过,或者服务器没有响应。\r\n超时已过期,超时时间在操作完成之前已过或者服务器没有回应。"}
这发生在直接与实体框架交互的存储库类中。
这似乎发生在登录并简单地从数据库中进行快速检查时,例如:
return entities.Users.SingleOrDefault(user => user.UserName == userName);
return (entities.Users.SingleOrDefault(u => u.UserId == user.UserId || u.UserName == user.UserName) != null);
我尝试过的东西:
- SQL Server验证
- 集成安全(我甚至允许所有可能的帐户完全访问数据库)
- 在IIS之外运行
- 在连接字符串中将连接超时设置为极高(连接超时=50000)。(此处未设置"默认命令超时")
- 在我的实体连接:entities上,将CommandTimeout设置为0、5000、100000,不管怎样。CommandTieout=100000
- 在我使用存储库实例的每个using语句中设置CommandTimeout
- 将SingleOrDefault切换为FirstOrDefault等
- 启用/禁用延迟加载(为什么不?)
如果有帮助:
- 我正在使用自定义角色和成员资格提供程序
- 我只是在using语句(AccountRepository bleh=new AccountRepository())中从控制器进行调用,AccountRepository实现IDisposable等
- 实体模型在一个单独的项目中
- 我正在IIS中运行该网站。它是用4.0集成应用程序池设置的
- 所有帐户都可以完全访问数据库
- 当错误发生时,只要我在web配置中设置了(我想是50000)或在存储库中设置了commandtimeout,就不会花太多时间
- 它在登录时没有做太多工作,只是验证用户,获取用户角色,然后加载一些少量数据,但在登录时获取用户数据时总是会出现错误
- 当我在调试之外尝试它时,它会重复错误四到五次(关闭自定义错误)
以下是事件日志中的完整异常:
Exception information:
Exception type: SqlException
Exception message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
您可以通过设置SQL server Profiler从数据库服务器检查问题。
你只需在谷歌上搜索一下,就可以找到很多关于SQL事件探查器的信息。这里有一个网站,里面有一段视频可能会帮助你入门。
编辑:虽然这确实对我有所帮助,但它不是解决方案。这个问题对于将来读书的人来说仍然存在
只是想让大家知道——我相信我已经找到了问题所在。通过SQL事件探查器,我发现用于访问SQL的帐户实际上是本地系统帐户。然后我意识到,为了解决之前的一个问题,我已将ASP.NET v4.0应用程序池更改为使用本地系统帐户。我去把标识改回"ApplicationPoolIdentity",把IIS APPPOOL\ASPNET v4.0用户添加到数据库中,到目前为止一切都很好@DOK-非常感谢您提供有关SQL事件探查器的信息,它提供了巨大的帮助!也谢谢大家!