2012-07-02 4 views
6

Я понимаю, что ASP.NET WEB API был создан, чтобы помочь реализовать легкие приложения на основе REST. Тем не менее, мне нужно, чтобы мои службы REST были транзакционными/были частью транзакции. Я попытался оглянуться, но похоже, что нет возможности заручиться WEB API как часть инициированной клиентом транзакции. Есть ли способ сделать это?Сделки с ASP.net WEB API

рассматривает Jagadish

+0

Что вы считаете сделкой? Общая единица работы? «DbTransaction» или «SqlTransaction»? – jrummell

+0

Я смотрел на транзакцию, управляемую DTC, но похоже, что WEB API не поддерживает ее – user1496864

ответ

4

Я считаю, что вы имеете в виду распределенные транзакции (через MSDTC), которые могут распространяться через границы обслуживания.

Однако распределенные транзакции через службы WCF RESTful невозможны, потому что просто невозможно распространить и управлять состоянием транзакции по простым HTTP-запросам.

Возможно, вы захотите просмотреть простые службы WCF, через HTTP (wsHttpBinding) или TCP/IP (net.tcp), или даже посмотреть на WCF Data Services.

4

Заручившись вызовов службы в операциях обычно считается как поведение SOAP не поведение REST. По крайней мере, существует стандартизированный способ сделать это с помощью SOAP, называемого WS-AtomicTransaction.

Будучи SOAP ориентированных, это явно не поддерживается Web API ASP.Net, но поддерживается WCF

http://msdn.microsoft.com/en-us/library/ms730266

можно было бы реализовать подобное подобное поведение себя в покое, но относительно сложно сделать это надежно.

+0

+1 за то, что она быстрее ... и правильно :) –

+0

«но это относительно сложно сделать надежно». - любые мысли о том, каким будет подход, если мы хотим его реализовать? – user1496864

11

Если вы контролируете оба конца провода, вы можете достичь того, чего хотите.

Класс TransactionInterop существует, чтобы обеспечить поддержку для работы с транзакциями между границами процесса, используя MS DTC.

Он содержит два метода, которые интересны ваш сценарий:

  • GetTransmitterPropagationToken - это получает маркер, который может быть использован для распространения сделки за пределами текущего процесса.

  • GetTransactionFromTransmitterPropagationToken - Принимает токен распространения и использует его для создания транзакции в локальной службе.

Вы можете использовать первый метод для своего клиента для создания транзакции. Вы можете установить его как пользовательское значение заголовка или куки-файл, чтобы передать его службе. После использования службы вы можете использовать второй метод для создания транзакции локально.

Главное предостережение заключается в том, что MS DTC необходимо будет активировать и настроить на клиенте и на сервере. Это действительно реально достижимо, если ваши службы вызывают в домене Active Directory Windows.