2

将 Azure 与 SQL Server 结合使用。在隐式调用 SimpleRoleProvider 的 30% 情况下,我们会收到错误:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接。该错误经常发生但不可重现。好像超时了。。

[Authorize(Roles = "Administrator")]
public class AdminController : Controller
{
   ...
}

堆栈跟踪如下所示:

[Win32Exception (0x80004005): Access is denied]

[SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)] System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection,操作1 wrapCloseInAction) +5296071 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +558 System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +5308555 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +145 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +889 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +307 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) +434 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +225 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +37 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions) +558 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions) +67 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +1052 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 重试,DbConnectionOptions userOptions,DbConnectionInternal& 连接)+78 系统.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +167 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 次重试,DbConnectionOptions userOptions) +143 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 重试) +83 System.Data.SqlClient.SqlConnection.Open() +96 System.Web.DataAccess.SqlConnectionHolder.Open(HttpContext 上下文, Boolean revertImpersonate) +88 System.Web.DataAccess.SqlConnectionHelper.GetConnection(String connectionString, Boolean revertImpersonation) +239 System.Web.Security.SqlRoleProvider.GetRolesForUser(String username) +762 WebMatrix.WebData.SimpleRoleProvider.GetRolesForUser(String username) +54 System.Web.Security.RolePrincipal.IsInRole(字符串角色)+9461104

我们自己的服务器上没有这个问题。这是配置问题吗?我们正在使用 Azure 的免费试用版。

- - 添加 - -

坏事是 MVC 框架“处理”请求,在给出的示例中(角色管理)。框架的用途是增加一个抽象层来方便地处理“域请求”。那么在这种情况下该怎么办呢?

提前感谢您的帮助!

4

2 回答 2

2

我假设 Azure 和 SQL Server 是指SAAS Azure SQL 数据库(名称更改速度比我跟踪的要快),而不是Windows Azure 上的 IAAS SQL Server。首先,您需要确定您的应用程序是否受到限制,请参阅连接约束并详细阅读这篇文章:连接终止的原因。如果您的应用程序受到限制,那么您需要重新审视您的设计并解决您受到限制的具体原因。

于 2013-05-19T13:01:19.520 回答
1

预计在 SQL Azure 上。它应该发生在大约 0.5% 的时间,而不是 30%。

这是解决此主题的先前问题

SQL Azure 中的连接失败很常见。这是因为您的应用程序将创建一个连接池,但是当您认为这些连接结束时,Azure 可能会在它们结束时终止它们,而您永远不会知道它。

您应该在代码上实现重试逻辑,以防发生这些超时之一。Microsoft 已经为此提供了一个库:瞬态故障处理应用程序块

于 2013-05-19T12:42:33.793 回答