【问题标题】:How should I go about guaranteeing that a "message" is sent and stored once and only once?我应该如何保证“消息”只发送和存储一次?
【发布时间】:2009-08-03 20:17:05
【问题描述】:

我正在为两家公司设计 EDI 系统:A 公司和 B 公司。A 公司已经作为一家小型制造企业而存在,而 B 公司是一家新公司,由所有者参与,围绕特定产品成立A 公司的。A 公司将拥有为 B 公司生产产品的专有权。

我负责这两家公司的所有 IT 和开发事务。我需要设计一个 EDI 系统,用于从 B 公司向 A 公司传达订单和其他信息,反之亦然(用于确认和状态更新等)。

这种类型的东西对我来说是相当新的,所以我只是在寻找有关如何将新订单从 B 公司发送到 A 公司并保证它到达那里、被存储并且不会被发送的建议不止一次。

我想我可能会用网络服务来做这件事。我应该研究 WCF 服务还是坚持使用 ASP.Net Web 服务?

我假设我会在每个订单中发送一个唯一的 ID,以便 A 公司的系统在发生混淆时识别不保存两次,但我如何确定 A 公司得到了信息?

欢迎任何其他提示或建议。

【问题讨论】:

    标签: .net wcf messaging edi


    【解决方案1】:

    请参阅Microsoft: ASMX Web Services are a “Legacy Technology”,了解为什么不坚持使用 ASMX Web 服务。

    订单不是已经有一些唯一标识了吗?

    无论如何,A 公司的服务都希望确保订单被安全地记录(可能在数据库中),然后才能完成“发送订单”操作。


    在 A 公司,我将创建一个订单处理服务。到目前为止,它只需要一种方法:AcceptOrder。这将接受处理订单所需的所有信息。此操作会首先将订单保存到数据库中,一旦数据安全存储,将返回某种确认码。

    再次发送相同订单的尝试将失败,因为您将在 B 公司的唯一订单标识符上保留一个唯一密钥。

    我们将信任我们的数据库,因此一旦我们知道数据已提交,就可以安全地回复“我们已经收到了!”

    也可以使用其他技术。例如,使用 MSMQ 的事务队列。它的好处是,一旦它说它有数据,你就可以相信它有数据。

    【讨论】:

    • 我明白了,但我怎么知道它已经完成了?我是否只返回一个确认码,以便它知道它已存储并收工?
    • 我只是不希望 B 公司有任何可能尝试发送订单,以为它已发送并存储,但 A 公司实际上并没有得到它的记录。
    • 当方法返回时,我会返回某种确认码。但是在该行被提交到数据库之前我不会返回。
    • 好吧,我想我只是想让它变得太难了……不过真的没有理由做比这更困难的事情了……谢谢
    • @quillbreaker:你不能是认真的,否则你没有注意到 ASMX 和 WCF 之间的区别。这并不新鲜。自从 WCF 被引入作为 ASMX、WSE 和 .NET Remoting 的明显替代品以来,这篇文章就一直在写。不要忘记 ASMX 自 .NET 1.0 以来就与我们同在。就像“遗产”一样,这是相当“遗产”。
    【解决方案2】:

    通过 Web 服务调用发送唯一 ID,并让 Web 服务返回唯一确认码和订单状态。那应该几乎涵盖了您。如果您愿意,您可以在 Web 服务中添加查询订单状态方法,以便查看之前是否已发送过订单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多