Службы WCF: обработка разорванного соединения - PullRequest
2 голосов
/ 07 марта 2011

Служба WCF вызывается для обновления записей в базе данных. Если соединение разорвано, служба продолжит обрабатывать данные, но клиент не будет знать о результатах. И.Е. обработка могла быть успешной или неудачной; клиент не знает, следует ли повторно отправить данные.

Типичным примером будет банковский депозит. Банкомат берет депозит и звонит в WCF, чтобы обновить счет клиента. Соединение разорвано, из-за чего банкомат не знает, был ли обработан депозит или нет. Если это не так, и банкомат не пересылается, у клиента нет денег на его счету. Если банкомат отправляется повторно, но депозит был обработан, у него будет два депозита.

Кажется, что нужно включить транзакции для вызова службы WCF, но могут ли они обработать разорванное соединение? И.Е. клиент может откатить транзакцию, если он потеряет соединение с сервером, но как сервер узнает об откате, если клиент не подключен?

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Кажется, что при любом взгляде на него возможна проблема серьезного катастрофического сбоя.

Предполагается, что вы используете асинхронные клиентские вызовы и / или объем обработки, выполняемой на стороне службы.относительно большой.Если по истечении определенного промежутка времени соединение с сервисом от клиента разорвано, клиент не сможет узнать, в каком состоянии последний раз был оставлен сервис. Если это была середина транзакции, транзакция на стороне сервисабудет отменен автоматически ... если это было после транзакции, то ваша работа выполнена ... но в обеих ситуациях клиент "никогда не узнает".

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

Короче говоря ... Я считаю, что единственное, что вы можете сделать в этом сценарии, этопусть клиентская сторона хранит какую-то контрольную сумму, которая бы соответствовала сервисной стороне, чтобы в случае сбоя соединения при повторном установлении соединения он мог проверить сервис, чтобы увидеть, действительно ли транзакция завершиласьили нет.

0 голосов
/ 08 марта 2011

Я бы использовал поставщика EAI, такого как BizTalk, для управления службами WCF и настройки компенсирующих операций для каждой из операций, предоставляемых службами, чтобы можно было выполнить откат в случае сбоя.

...