2011-03-07 57 views
2

有一个WCF服务被调用来更新数据库中的记录。如果连接中断,服务将继续处理数据,但客户端将不知道结果。 I.E.处理可能成功或失败;客户端不知道它是否应该重新发送数据。WCF Services:丢弃的连接处理

典型的例子是银行存款。 ATM收取押金并进行WCF呼叫以更新客户的账户。连接被中断,ATM不确定是否处理了存款。如果不是这样,并且自动柜员机不重新发送,那么客户在他的账户中没有钱。如果ATM重新发送,但存款已处理完毕,他将有两笔存款。

在WCF服务调用上启用事务似乎是要做的事情,但他们可以处理丢弃的连接吗? I.E.如果客户端失去与服务器的连接,客户端可以回滚事务,但如果客户端未连接,服务器如何知道回滚?

+0

er ...是“TIA,James”不适合添加到问题吗?你为什么删除它? –

回答

1

看来,无论你如何看待它,严重的灾难性失败都有可能发生。

假设您正在使用异步客户端调用和/或在服务端执行的处理量相对较大。如果在时间跨度的范围内,客户端与服务的连接被中断,那么客户端就无法知道服务最后留下的状态。如果是中间事务,服务端事务将被自动取得...如果是交易后,那么你的工作就完成了......但在这两种情况下,客户都将“永远不知道”。如果一台ATM在存款过程中失去了连接,理论上......(并且不要在此引用我,但它听起来像一个合乎逻辑的场景)......我相信(并且像我说过的那样,请在此引用我)ATM本身保存内存中的事务列表,以便在事务失败的情况下,一旦连接重新建立,它可以自行检查并验证事务是否实际完成。 (如果它实际上不这样做......我会有点担心)。

长话短说......我相信在这种情况下唯一可以做的事情是让客户端保持某种与服务端匹配的校验和,这样如果发生连接失败,当连接重新建立时,它将能够检查服务以查看事务是否确实完成。

+0

检查一次连接是否恢复正常,但是要检查什么?最近有一笔100美元的存款?不是很可靠......一位同事的建议是从WCF服务申请一个交易ID并将其传递给实际的存款电话......虽然这似乎变得相当迅速复杂。 –

+0

你可以请求任何你想要的东西......只要你愿意构建它......你可以散列交易本身的数据并检查哈希客户端。你的权利。它确实有可能非常迅速地变得非常复杂。 – Patrick

0

我会使用BizTalk等EAI提供程序编排WCF服务,并为服务公开的每个操作设置补偿操作,以便在发生故障时执行回滚。

+0

我会研究更多...现在,这是一个很大的学习曲线,还有很多软件/硬件/设置...不认为我可以在短期内做到这一点:( –