Транзакция в сервисе REST WCF

У нас есть служба ОТДЫХ WCF. мы хотим, чтобы операция сохранения для этого сервиса REST была в транзакции. Есть ли способ передать объект транзакции через провод в службу REST WCF?

4 ответа

Решение

Вот цитата из Роя Филдинга, парня, который изобрел термин REST

Если вам нужен протокол распределенных транзакций, то как вы можете сказать, что ваша архитектура основана на REST? Я просто не могу понять, как можно из одной ситуации (использования состояния приложения RESTful на клиенте и гипермедиа для определения всех переходов состояний) перейти к следующей ситуации, когда требуется распределенное соглашение семантики транзакций, когда клиент должен сказать серверу, как управлять свои собственные ресурсы.

... пока я считаю "транзакцию отдыха" оксюмороном.

Это из сообщения в списке REST-обсуждения от 9 июня 2009 года.

Я в основном согласен с цитатой Роя Филдинга в ответе Даррела. Вы никогда не должны подвергать слежку за приложениями, как транзакции базы данных, через веб-сервис RESTful. Однако вы можете подходить к распределенным транзакциям более функционально.

Допустим, вы внедрили систему торговых точек, которая может собирать подарочные сертификаты на покупки. Клиенты должны иметь возможность сочетать подарочные сертификаты с платежами по кредитным картам. И подарочные сертификаты, и платежи по кредитным картам обрабатываются системами, внешними по отношению к точке продажи. Сбор подарочного ваучера и оплата кредитной картой должны быть атомарной транзакцией. Чтобы упростить задачу, давайте сосредоточимся на одном случае: покупатели сначала соберут подарочный ваучер и оплатят оставшуюся сумму своей кредитной картой. Оплата кредитной картой может не состояться, поэтому вы также можете откатить коллекцию подарочных сертификатов, когда это произойдет.

Служба подарочных сертификатов предоставляет URL для запуска коллекции:

/gift-voucher/{gift-voucher-id}/collection

Запрос этого URL создаст и сохранит резервирование для подарочного ваучера. Ответ содержит URL-адрес для бронирования:

/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id}

Этот URL может быть либо POSTed, либо DELETEd, чтобы соответственно выполнить или отменить коллекцию подарочных сертификатов.

Обратите внимание, что этот подход может быть оправдан только для сервисов приложений, где есть функциональный вариант использования для отката транзакции (т. Е. Неудачной оплаты кредитной картой). Попытка применить это на сервисах более низкого уровня, таких как сервисы сущностей, вероятно, потребует много работы и будет ужасной. В этом случае вы можете задаться вопросом, действительно ли сервис RESTful является лучшим выбором.

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

Возможно, вы захотите проверить устройства ADO.NET Dataservices, которые являются слоем поверх WCF REST.

См. Сообщение в блоге группы ADO.NET DataServices об этом.

Марк

Вот недавнее обсуждение этой темы: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d

В основном это говорит: один запрос не поддерживает транзакции, и нет смысла поддерживать их, так как только один объект и операция CUD участвуют в одном запросе POST/PUT/DELETE. Но транзакции могут быть реализованы на стороне сервера:

  • использование пакетных запросов (целый пакет запросов POST/PUT/DELETE, отправляемых за один шаг от клиента к серверу)
  • и использование конвейера обработки (начать транзакцию в событии Processing и зафиксировать / откатить транзакцию в событии Processed)
Другие вопросы по тегам