#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, возвращаемое значение вместо этого будет переопределено значением, введенным на портале «