Вызов WCF с помощью NetMSMQBinding Inside TransactionScope останавливает транзакцию
-
19-09-2019 - |
Вопрос
У меня есть служба ведения журнала WCF, которая работает над MSMQ. Элементы регистрируются в базе данных SQL Server 2005. Все функции правильно, если используются вне TransactionScope. При использовании внутри экземпляра TransactionScope вызов всегда вызывает прерывание транзакции. Сообщение = «Транзакция прервалась».
Что мне нужно сделать, чтобы заставить этот звонок работать в транзакции? Возможно ли это. Я прочитал, что для клиентской транзакции протекает через границу сервиса, связывание должно поддерживать поток транзакции, что немедленно ограничивает привязки только NetNamedPipeBinding, NetTCPBinding, WSHTTPBinding, WSDualHttpBinding и wsfederationhttpbinding.
Решение
Я не совсем знаю о MSMQ, но есть действительно хорошая серия постов в блоге Тома Холланда на MSMQ, IIS и WCF: заставлять их играть хорошо - В части 3, которая является ссылкой, предоставленной Томом о получении транзакционного.
MSMQ может быть транзакционным - или нет. А в WCF вы можете украсить как контракт на обслуживание, так и отдельные операционные контракты (методы) атрибутами, связанными с транзакциями, например, разрешать, запретить или требовать контекста транзакции.
Насколько я понимаю, в вашей настройке вы не хотите, чтобы часть MSMQ была транзакционной, но вы должны иметь возможность использовать ее, даже если присутствует обстановка транзакции. В этом случае вам необходимо добавить TransactionFlow = "разрешен" в свой контракт на операцию, как это:
[ServiceContract]
public interface ILoggingService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void LogData(......);
}
Это должно это сделать!
Марк
Другие советы
Извините за ненужный вопрос ...
Я решил свою проблему. Мне нужно было поместить
[TransactionFlow(TransactionFlowOption.Allowed)]
При операции в контракте на обслуживание, а затем
[OperationBehavior(TransactionScopeRequired=true)]
При реализации контракта (сама услуга).
Работает угощение.