#wcf #msdtc
#wcf #msdtc
Вопрос:
Я не эксперт по WCF и MSDTC, так что, надеюсь, это что-то простое. У меня есть клиентский сервер, сервер веб-служб и база данных. Я хочу иметь возможность переносить вызовы на сервер веб-служб в TransactionScope, чтобы в случае сбоя в операции я мог отказаться. Эта настройка работает нормально, когда все 3 компонента находятся на моем локальном компьютере. Когда я перемещаю их на отдельные серверы, все работает до тех пор, пока вызов не попадает в область транзакций.
Я вижу, что транзакция добавляется как на клиенте, так и на сервере веб-служб в dcomcnfg -> службы компонентов -> Компьютеры -> Мой компьютер -> Координатор распределенных транзакций -> Локальный DTC. Я вижу, что одна и та же транзакция отображается на обеих машинах. Проблема в том, что она просто ожидает истечения времени ожидания и завершается сбоем. Если я посмотрю в свои журналы транзакций на предмет вызовов веб-службы, которые должны были выполняться, имели место в TransactionScope, их там нет.
Чего я не понимаю?
Ответ №1:
Я не советую использовать TransactionScope через границы службы WCF, но если вы должны прочитать это:
http://www.stevefenton.co.uk/Content/Blog/Date/200911/Blog/TransactionScope-and-WCF-Services/
Ответ №2:
Недавно я видел похожие симптомы при настройке NServiceBus и NHibernate с помощью MSDTC.
Решение моей проблемы включало проверку используемой аутентификации.
В локальном DTC координатора распределенных транзакций перейдите в свойства и проверьте вкладку Безопасность. Возможно, вам нужно включить доступ к сетевому DTC или изменить используемую аутентификацию. Попробуйте без аутентификации, чтобы увидеть, работает ли это, и заблокируйте при необходимости.
Комментарии:
1. Я уже установил для нее значение без аутентификации и все еще получаю то же поведение.
Ответ №3:
В этом случае это оказалось проблемой брандмауэра. Я отложил идею о том, что это проблема брандмауэра, поскольку я видел, что транзакция отображается в списке транзакций сервера службы, но добавление координатора распределенных транзакций в список разрешенных для связи с доменом в брандмауэре устранило проблему.