Ошибка открытия SqlConnection внутри TransactionScope

#azure #ado.net #transactionscope #sqlconnection

#azure #ado.net #transactionscope #sqlconnection

Вопрос:

Мы пытались использовать a SqlConnection внутри a TransactionScope . Когда мы создаем сайт и пытаемся выполнить этот вызов базы данных, мы сталкиваемся с ошибкой:

При получении результатов с сервера произошла ошибка транспортного уровня. (поставщик: поставщик TCP, ошибка: 0 — Существующее соединение было принудительно закрыто удаленным хостом.)

Ошибка возникает в строке cnn.Open() .

 using (var scope = new TransactionScope())
using (var cnn = new SqlConnection(connectionString))
{
    cnn.Open();
    int result = cnn.QuerySingle<int>("SELECT 1");
    Console.WriteLine(result);
}
  

Мы создали консольное приложение, чтобы выяснить, что было не так, и обнаружили, что изменение ключевого слова строки подключения «Объединение» с «false» на «true» позволяет запускать его в консольном приложении и успешно возвращать наш результат.

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

Есть ли какая-либо причина, по которой этот код не работает?

Комментарии:

1. Во-первых, почему объединение отключено? Во-вторых, это пахнет как объединение в пул, в результате чего одно и то же физическое соединение повторно используется для нескольких логических подключений. Это недетерминированное и может прерваться в любое время. Опубликуйте более полный код. Вероятно, существует несколько запросов или несколько открытых.

2. Объединение в пул было отключено в строке подключения, предоставленной нам порталом Azure. Мы попытались включить это, и это сработало на моем локальном компьютере, но не при развертывании в нашем веб-приложении. Это не имеет значения, когда есть один или несколько запросов или подключений, сбой при первом открытии

Ответ №1:

Я предполагал, что web.config был законом, поскольку просмотр файла через службу Kudu показал мою ожидаемую строку подключения, но, по-видимому, это не так в Azure.

Я обнаружил, что профиль публикации Azure переопределяет нашу строку подключения web.config, это переопределение по-прежнему содержало «Объединение = false».

Удаление этого теперь позволяет нашему коду выполняться по назначению.

В этом сообщении в блоге объясняется больше:

«Когда этот код выполняется на локальном компьютере разработчика, возвращаемое значение будет значением из файла web.config. Однако, когда этот код выполняется на веб-сайтах Windows Azure, возвращаемое значение вместо этого будет переопределено значением, введенным на портале «