Microsoft Azure> Web App - подключение к SQL было принудительно закрыто удаленным хостом - происходит только при первом вызове после простоя - PullRequest
0 голосов
/ 08 июня 2019

Это происходит при настройке приложения MS Azure при подключении к экземпляру SQL MI. Транспортные потоки через HCM.

Тот же код работает при предварительной настройке, когда веб-приложение напрямую запрашивает SQL-сервер 201.

"Эта проблема воспроизводима, если мы оставляем приложение в бездействии в течение нескольких минут и перезапускаем любой запрос, имеющий взаимодействие с базой данных". Как только приведенная ниже ошибка регистрируется, последующие запросы работают нормально.

Ниже регистрируется ошибка:

    Properties:
      SqlException.Errors = {
        "System.Data.SqlClient.SqlError: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. 
(provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)",
      }
      SqlException.ClientConnectionId = "4560-9ca8-53ea0fdeca60"
      SqlException.Class = "20"
      SqlException.LineNumber = "0"
      SqlException.Number = "10054"
      SqlException.Procedure = ""
      SqlException.Server =""
      SqlException.State = "0"
      SqlException.Source = ".Net SqlClient Data Provider"
      SqlException.ErrorCode = "-2146232060"

    Data:
    HelpLink.ProdName = "Microsoft SQL Server"
    HelpLink.EvtSrc = "MSSQLServer"
    HelpLink.EvtID = "10054"
    HelpLink.BaseHelpUrl = "http://go.microsoft.com/fwlink"
    HelpLink.LinkId = "20476"
    MS_LoggedBy = "System.Collections.Generic.List`1[System.Object]"

    Stack Trace:
       at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
       at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
       at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
       at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
       at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
       at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)

Я пытался использовать документацию, доступную в Интернете, MSDN,

а. Я начал детально регистрировать журналы System.Net для HCM. Но на уровне сокета проблем не обнаружено. Ниже исключение регистрируется в Event Viewer

    HybridConnectionManager Trace: System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> 
System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
       at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
       at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)

б. Учитывая, что это может быть сбрасывание tcp-соединения, я попытался сделать пул соединений = False.

с. Проверено, удаляется ли соединение. Код написан в блоке Using и определен.

1 Ответ

0 голосов
/ 24 июня 2019

Я решил это.Это связано с обрывом соединения.Нам нужно использовать механизм повторного подключения.а.Использовать корпоративную библиотеку для временных блоков ошибок b.Определите политику повторных попыток c.Изменить соединение ado.net с SqlConnection на ReliableSqlConnection

...