【问题标题】:WCF SOAP IdempotentWCF SOAP 幂等
【发布时间】:2011-10-10 06:46:44
【问题描述】:

我可能在这里让自己感到困惑,但我说我希望服务是幂等的。也就是说,多次接收相同的请求不会改变系统的状态。在断开连接的集成系统中接收消息时,这对我来说很有意义。例如,通过 MSMQ 接收消息并使用某种形式的服务来处理接收到的消息。即使收到 10 条重复消息,您也希望服务处于一致状态。

我现在正在努力解决的问题是如何使用执行 CRUD 操作的标准 WCF SOAP 服务。幂等性问题是否只有在异步调用时才会生效?同步调用本质上是幂等的吗?查看 CRUD 操作,唯一不是幂等的操作是 create。您可以对 WCF 进行重复的创建调用吗?

谢谢

【问题讨论】:

    标签: .net wcf integration messaging


    【解决方案1】:

    我想这取决于您(在您的域中)将什么定义为重复项。一旦定义好,您就可以在创建记录之前运行检查。例如我有一个PersonFirstNameLastName 等...重复的人将由FirstName + LastName 识别。

    您希望您的服务收到什么样的重复消息?同一个客户“点击提交按钮两次”?还是两个不同的客户端试图同时更新一条记录?

    【讨论】:

    • 那么您是否对所有创建操作进行了检查,以确保没有添加重复项或至少向用户返回异常以通知他们该记录已存在?
    • 如何执行重复检测取决于您。您可以在数据库端创建唯一约束,让您的应用在事务内执行选择,或两者兼而有之。在这里抛出异常是可以接受的,或者您可以返回类似“操作状态 = 失败”的内容。
    【解决方案2】:

    同步或异步无关紧要。想想如果请求正在处理但在收到响应之前连接丢失怎么办。因此,您的客户端收到错误,但服务器已处理请求。更新是幂等的,因为在最坏的情况下,您会更新记录两次。

    【讨论】:

    • 好的,但是当他们执行创建时该操作呢?数据库中发生了创建,响应过程中出错,用户得到错误。用户然后尝试再次添加,如果使用类似标识列的内容,则将再次添加记录。我想您需要进行一些检查以确保不会发生这种情况?
    • 最简单的方法是由客户端生成身份(例如使用 GUID)。您也可以先在服务器上创建对象,然后让用户编辑新条目。但是,如果用户取消创建,则必须删除该对象。
    • 如果您连接了多个客户端,代理身份并不总是有效。但是,“名字 + 姓氏”也不总是有效。这取决于你愿意接受什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2012-12-09
    • 2012-02-26
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多