Поскольку вы уже используете вход, нет смысла использовать NodePort. Поскольку у вас уже есть способ получить доступ к вашему приложению. Вполне нормально иметь тип сервиса, который вам нужен на уровне сервиса, который вам нужен для внутреннего доступа (в рамках Kubernets).
Вам необходимо включить сетевой доступ по DTC, как описано в этой статье Microsoft TechNet . Это изменение может потребоваться как на базе данных, так и на серверах приложений. Часто DTC уже включен на сервере базы данных, поэтому я сначала посмотрю на сервер приложений.
Вот снимок экрана того, что мы используем, за исключением опции «Разрешить удаленное администрирование»:
Я не сталкивался с проблемой HRESULT E_Fail, которая у вас сейчас есть, но в этой статье о XP SP2 и транзакциях было это интересное предложение:
Другой параметр конфигурации, который вы нужно знать (хотя я считаю, это редкий сценарий) Раздел реестра RestrictRemoteClients. Если значение этого ключа установлено в 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH) затем Сетевые транзакции MSDTC не будут умеет нормально работать. MSDTC поддерживает только RPC_RESTRICT_REMOTE_CLIENT_NONE (0) и RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1) ценности. Видеть http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 для получения дополнительной информации о RestrictRemoteClients.
Наконец, хотя и не относится к вашей проблеме, очень важно отметить, что использование класса TransactionScope
заключается в том, что по умолчанию используется уровень изоляции транзакции для Serializable , Сериализуемый является наиболее ограничивающим из уровней изоляции, и, откровенно говоря, удивительно, что он был выбран по умолчанию. Если вам не нужен этот уровень блокировки, я настоятельно рекомендую установить уровень изоляции на менее ограничивающий параметр (ReadCommitted) при создании экземпляра TransactionScope
:
var scopeOptions = new TransactionOptions();
scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
scopeOptions.Timeout = TimeSpan.MaxValue;
using (var scope = new TransactionScope(TransactionScopeOption.Required,
scopeOptions))
{
// your code here
}
Панель управления - Администрирование - Службы компонентов - Свойства моего компьютера - Вкладка MSDTC - Вкладка Конфигурация безопасности - Доступ к DTC по сети (проверено) / Разрешить удаленных клиентов (проверено) / Разрешить входящие (проверено) / Разрешить исходящие (проверено) / Включить TIP-транзакции (проверено)
Перезагрузить компьютер.
В зависимости от используемого бэкэнда TransactionScope часто требует Диспетчер распределенных транзакций должен быть включен. Некоторые подробности приведены в в этом блоге MSDN .
Также, если вы используете несколько ресурсов, может потребоваться DTC. Включение DTC может потребоваться в вашей ситуации или убедиться, что вы используете SQL Server 2005 и придерживаетесь того, что было бы выполнимо в облегченных транзакциях.
Необходимо включить DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов.
Если вы используете SQL Server 2000, System.Transactions.TransactionScope
приведет к тому, что все транзакции будут преобразованы в распределенные транзакции, что потребует запуска координатора распределенных транзакций MS.
Это можно исправить, запустив службу MSDTC, обновив до SQL Server 2005 или внедрив что-то вроде моего решения для codeproject: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx
I Мне никогда не требовалось этого делать, но вы также должны проверить ответ Ocdecio для настройки параметров безопасности сети для DTC.
Необходимо включить сетевой доступ по DTC как для сервера базы данных, так и для сервера, на котором запущено приложение.
Вам также необходимо убедиться, что соединения не будут заблокированы брандмауэром. Поскольку соединение с сервером базы данных к компьютеру приложения будет инициировано, не менее важно добавить MSDTC в список исключений брандмауэра на компьютере приложения.
У меня была такая же проблема при выполнении интеграционных тестов.
Я разместил вопрос об этом здесь
, но в конце концов я нашел способ обойти это. Хотя я бы не советовал делать это для производственного кода. Я делал это в контексте тестирования.