Произошла ошибка во время установления связи с предварительным подключением

Пожалуйста, прочитайте полностью, прежде чем отмечать это как дубликат.

В проекте, который я отлаживаю, я получаю SqlException, говоря следующее:

Дополнительная информация: соединение было успешно установлено с сервером, но затем произошла ошибка во время установления связи перед входом в систему. (поставщик: поставщик SSL, ошибка: 0 - время ожидания ожидания).

Это произошло во время сеанса отладки, когда предыдущий сеанс выполнялся только секунды до этого без проблем. Начиная с первоначального исключения, я не могу подключиться к серверу базы данных в этом проекте. Исключение генерируется при вызове метода SqlConnection.Open().

Фон

Это не первый случай, когда я получил это. Раньше я боролся с ним в течение двух недель, в конце концов, инициировал для него билет поддержки Microsoft. В этом случае оказалось, что свойство ApplicationName в строке соединения слишком длинное (мы использовали полное имя сборки), и сокращение его облегчало проблему.

На этот раз существует

  • Нет значения ApplicationName
  • WinSocks находится в состоянии по умолчанию
  • Антивирус (ESET) был отключен и не был проблемой.
  • Ничего не было установлено между рабочим и нерабочим сеансом отладки

Наконец, по прихоти, я создал новый проект, единственной целью которого было подключение к этому же SQL-серверу. Я скопировал строку подключения из нерабочего проекта, в новый проект и подключился. Существует ли какое-то кеширование для каждого проекта? Что-то, что переживает Clean > Rebuild и перезапуск Visual Studio и Windows тоже?

Соответствующий код

    public SqlConnection OpenSqlConnection(string connectionString)
    {
        var conn = new SqlConnection(connectionString);
        conn.Open();
        _connectionString = connectionString;
        var sb = new SqlConnectionStringBuilder(_connectionString);
        _server = sb.DataSource;
        _database = sb.InitialCatalog;
        return conn;
    }

Строка соединения, которая передается, выводится из SqlConnectionStringBuilder в другом месте приложения. Строка подключения аналогична: "Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"

Ответ 1

Для меня хитрость заключалась в увеличении времени ожидания в строке подключения, поскольку при подключении по vpn установление соединения занимало много времени. Вы можете сделать это, добавив; время ожидания соединения = значение

Я получил ту же ошибку при подключении приложения пытался подключиться к серверу sql, когда я был на vpn.

По умолчанию время ожидания установлено на 15 секунд.

Кажется, у вас уже есть 60 секунд, может быть, вам просто нужно больше...

Надеюсь, это поможет!

Ответ 2

Попробуйте явно добавить Application Name=MyAppName; в строку подключения. Автоматически генерируемое значение из имени сборки может превышать некоторый предел.

Проверьте сетевые настройки для таких вещей, как явно ограниченный размер кадра. Перезагрузите маршрутизатор, если SQL Server запущен на другой машине.

Попробуйте добавить Pooling=False; в строку подключения и проверить, разрешает ли эта проблема повторные подключения при перезапуске приложения.

Ответ 3

Эта проблема может быть связана с межсетевым экраном в середине, который выполняет проверку SSL.

Я предлагаю вам либо повторить попытку, используя другое соединение без проверки SSL, либо попросить администратора брандмауэра создать исключение для источника и/или места назначения, к которому вы подключаетесь,

Ура!

Ответ 4

Итак, эта проблема продолжала меня задевать, и похоже, что это была функция задержки в моей домашней сети (я - удаленный разработчик), а рабочая сеть - через VPN. У меня среднее время пинга в 100 мс для серверов в рабочей сети.

Настоящая странность заключается в том, что строка подключения работала без проблем в течение нескольких месяцев, а затем внезапно остановилась. В то время значение имени приложения было чем-то вроде Application Name = "MyProgram.DAL. Culture = en, PublicKeyToken = 1a1a1a1a1a1a1a1a, Version = 1.0.0.0". Другими словами, полное имя сборки. В конце концов я изменил это на сокращенное имя типа "MyProgram.DAL", и он снова работал.

Несколько месяцев спустя снова меня охватило это. И я обнаружил, что, если я просто съел исключение и подождал несколько тиков, все было в порядке. Приложение будет с удовольствием использовать соединение, даже если оно сообщило, что оно не выполнено. Таким образом, я изменил метод на ниже:

    public SqlConnection OpenSqlConnection(string connectionString)
    {
        var conn = new SqlConnection(connectionString);
        var retries = 10;
        while (conn.State != ConnectionState.Open && retries > 0)
        {
            try
            {
                conn.Open();
            }
            catch (Exception)
            {

            }
            Thread.Sleep(500);
            retries--;
        }

        _connectionString = connectionString;
        var sb = new SqlConnectionStringBuilder(_connectionString);
        _server = sb.DataSource;
        _database = sb.InitialCatalog;
        return conn;
    }