Вызов WCF с помощью NetMSMQBinding Inside TransactionScope останавливает транзакцию

StackOverflow https://stackoverflow.com/questions/1524079

Вопрос

У меня есть служба ведения журнала 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)] 

При реализации контракта (сама услуга).

Работает угощение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top