2009-09-07 7 views
10

У нас есть служба REST WCF. мы хотим, чтобы операция сохранения в этой службе REST выполнялась в транзакции. Есть ли способ передать объект Transaction через провод для службы REST WCF?Сделка в службе REST WCF

ответ

13

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

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

... на данный момент я считаю «транзакцию отдыха» быть оксюмороном.

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

+0

Хорошо, поэтому Филдинг должен объяснить (понятно, что само по себе является задачей), как я должен сообщать серверу: создайте эти два ресурса, но в то же время вместо создания первого этого ресурса, то этот другой ресурс , –

+3

POST/MyResourcePairs Я бы дал вам более реальный пример, но вы обнаружите, что в большинстве случаев, когда должна произойти транзакция, существует одно существительное, которое пользователь использует для ссылки на это событие. Поэтому, с точки зрения конечного пользователя, то, что вы описываете, очень редко существует. –

+0

Другими словами, это нарушит ограничение без сохранения. – inf3rno

1

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

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

Об этом сообщается командой ADO.NET DataServices blog post.

Марк

0

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

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

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

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

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

Подарочный ваучер служба выставляет URL для начала сбора:

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

запрашивающая этот URL будет создавать и упорствовать заказ на подарочный сертификат. Ответ содержит URL для заказа:

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

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

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