Во-первых, вам придется использовать транзакционные сервисные вызовы здесь - и поскольку у вас есть «инициализирующий» вызов, несколько промежуточных вызовов, а затем, возможно, один для завершения всех вызовов, я бы порекомендовал вам взглянуть на атрибуты «IsInitiating» и «IsTerminating» в OperationContract для методов - это позволит вам указать один метод для начала сеанса и один для его завершения.
Затем убедитесь, что вы сконфигурировали свою службу как транзакционную, указав атрибут «TransactionFlow» либо для службы, либо для всех операций - в зависимости от того, что вы предпочитаете.
В вашем клиентском коде вам придется использовать System.Transactions для создания TransactionScope, который будет упаковывать ваши сервисные вызовы. Это легкий или полностью двухфазный координатор распределенных транзакций - в зависимости от того, что ваши звонки делают подробно.
Что-то в этом роде:
1) Отметить привязку как транзакционную:
<bindings>
<wsHttpBinding>
<binding name="TransactionalWsHttp" transactionFlow="true" />
</wsHttpBinding>
</bindings>
2) Договор на обслуживание:
[ServiceContract]
public interface ITenderService
{
// method to start your submission process
[OperationContract(IsInitiating=true, IsTerminating=false)]
[TransactionFlow(TransactionFlowOption.Mandatory]
public void StartTenderProcess();
// all your other methods "in between"
[OperationContract(IsInitiating=false, IsTerminating=false)]
[TransactionFlow(TransactionFlowOption.Mandatory]
public void AddTender()
[OperationContract(IsInitiating=false, IsTerminating=false)]
[TransactionFlow(TransactionFlowOption.Mandatory]
public void AddTenderDocument()
[OperationContract(IsInitiating=false, IsTerminating=false)]
[TransactionFlow(TransactionFlowOption.Mandatory]
public void AddTenderItem()
...
// method to end your submission process
[OperationContract(IsInitiating=false, IsTerminating=true)]
[TransactionFlow(TransactionFlowOption.Mandatory]
public void FinishTenderProcess();
}
3) В коде вашего клиента:
using (TransactionScope ts = new TransactionScope())
{
serviceClient.StartTenderProcess();
.....
serviceClient.FinishTenderProcess();
ts.Complete(); // Transaction Commit
}
Помогает ли это вам на время начать ?? ?? 1018 *
Марк