2

Итак, у меня есть следующий тривиальный код в контроллере WebAPI, который публикуется на веб-сайте службы Azure App.TransactionScope на Azure App Services с Sql Azure

using (var tx = new TransactionScope()) 
{ 
    var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["OrganizationManagement"].ConnectionString); 
    connection.Open(); 
    return Enumerable.Empty<TimeSessionDTO>(); 
} 

100% времени, это дает мне исключение транспортной ошибки на открытом вызове:

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Я попытался с помощью ReliablSqlConnection от Transient Fault Handling EL блок с помощью экспоненциальной политики повторных попыток, и я просто закончил с таймаутом транзакции с этим.

Если я удалю окружающий TransactionScope, он работает и не генерирует исключения.

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

Что может случиться, что я не могу открыть соединение с базой данных внутри транзакции на веб-сайте Azure?

Обновление: Следует также отметить, что использование Entity Framework DbContext внутри TransactionScope работало нормально. По какой-то причине это просто задыхается от простого ADO.NET.

FYI Я также пробовал его в новом приложении MVC на Azure с тем же результатом. Я просто этого не понимаю :)

+0

На самом деле это тоже не работает с Entity Framework. Я действительно не понимаю :) – Gerald

ответ

1

Вау, поэтому проблема, похоже, связана с строкой соединения. Когда я впервые развернул базу данных, я позволил проекту базы данных построить строку соединения из информации о сервере/базе данных/пользователе, которую я позже добавил в файл Web.config в проекте WebAPI. Затем, когда я развернул проект WebAPI, я думаю, он сохранил эту строку соединения в профиле публикации.

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

Я думаю, это объясняет, почему это сработало, когда я запускал его локально, но я понятия не имею, почему это произошло только в случае транзакции.

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