2

Использование Azure с SQL Server. В 30% случаев, когда SimpleRoleProvider неявно называется, мы получаем ошибку: Named Pipes Provider, ошибка: 40 - Не удалось открыть соединение с SQL Server. Ошибка возникает часто, но не воспроизводима. Это выглядит как тайм-аут ..Azure и SQL Server: поставщик Named Pipes, ошибка: 40 - Не удалось открыть соединение с SQL Server

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

Трассировка стека выглядит следующим образом:

[Win32Exception (0x80004005): Access is denied] 

[SqlException (0x80131904): Произошла ошибка сети связанных или экземпляра конкретных при установлении соединения с SQL Server , Сервер не найден или не был доступен. Проверьте правильность имени экземпляра и настройте SQL Server для удаленного подключения. (поставщик: поставщик Named Pipes, ошибка: 40 - не удалось открыть соединение с SQL Server)] System.Data.SqlClient.SqlInternalConnection.OnError (исключение исключения SqlException, логическое разрытие соединения, действие 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, TaskCompletionSource 1 повтор, DbConnectionOptions userOptions, DbConnectionInternal & соединение) +78 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection (DbConnection owningConnection, TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +167 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 повторных попыток, 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.GetConnectio п (String ConnectionString, Boolean revertImpersonation) +239 System.Web.Security.SqlRoleProvider.GetRolesForUser (String имя пользователя) +762 WebMatrix.WebData.SimpleRoleProvider.GetRolesForUser (String имя пользователя) +54 System.Web.Security.RolePrincipal.IsInRole (Роль строки) +9461104

У нас нет этой проблемы на нашем собственном сервере. Это проблема конфигурации? Мы используем бесплатную версию Azure.

--- Сложение ---

Плохо то, что MVC-основа "обрабатывает" запрос, в данном примере (Role Management). Использование фреймворка заключается в том, чтобы добавить слой абстракции для удобной обработки запроса домена. Так что делать в этом случае?

Заранее благодарим за любую помощь!

+0

Странно, но мы чувствуем, что ошибка происходит чаще, используя IExplorer (против Chrome). – Gerard

+0

Я не думаю, что это проблема, связанная с браузером. Откуда вы подключаетесь к БД? Ваш веб-сервер на посылке? – QFDev

+0

База данных - это база данных Azure. Да, вы правы, это не может быть проблемой браузера. Тем не менее, статистически, Chrome работает лучше (!?!?) – Gerard

ответ

2

Я предполагаю, что на Azure и SQL Server вы имеете в виду SAAS Azure SQL Database (имена меняются быстрее, чем я могу следить), а не МААН SQL Server on Windows Azure. Первое, что вам нужно определить, чтобы ваше приложение было дросселировано, см. Connection Constraints и дайте этой статье хорошую, точную информацию: Causes of Connection Termination. Если ваше приложение дросселируется, вам нужно пересмотреть свой дизайн и задать конкретную причину, по которой вас дросселируют.

+0

Спасибо за вашу помощь. Мы развернули нашу локальную базу данных в Sql Azure, предположим, что это делает SQL Server на Windows Azure. Большинство сеансов затухают из-за таймаута. Плохо то, что MVC-каркас «обрабатывает» запрос в приведенном примере. Использование фреймворка заключается в том, чтобы добавить слой абстракции для удобной обработки запроса домена. Так что делать в этом случае? – Gerard

+0

Нет такой вещи, как «дросселирование из-за таймаута». Throttled означает очень специфическое состояние вашей подписки, это не просто другое имя для «ошибки». ** ** внимательно прочитайте статьи ** и следуйте советам. –

1

Ожидается, что на SQL Azure. Это должно произойти примерно в 0,5% случаев, а не 30%.

Here's a previous question that addressed this topic

Connection failures in SQL Azure are common. This is because your application will create a connection pool but while your side thinks these connections are over, Azure could terminate them at their end and you will never know about it.

Вы должны реализовать логику повторных попыток на ваш код в случае, если один из этих тайм-аута происходят. Microsoft уже есть библиотека для этого: Transient Fault Handling Application Block

Смежные вопросы