Транзакция WCF MSDTC повышена, но не выполнена

#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:

В этом случае это оказалось проблемой брандмауэра. Я отложил идею о том, что это проблема брандмауэра, поскольку я видел, что транзакция отображается в списке транзакций сервера службы, но добавление координатора распределенных транзакций в список разрешенных для связи с доменом в брандмауэре устранило проблему.