【问题标题】:How to ensure message delivery to SOAP endpoint?如何确保消息传递到 SOAP 端点?
【发布时间】:2013-01-24 21:05:10
【问题描述】:

我在一个 c# MVC 项目中使用了一个众所周知的不可靠的 SOAP Web 服务。我无法控制该服务。它偶尔会长时间停止响应。有没有一种简单的方法,从客户端,以设定的时间间隔继续重试发送消息,直到我收到来自服务的响应?

我查看了 MSMQ 和 ws-reliability,但在我看来,这两个选项都需要对 Web 服务进行一些控制。有什么可以帮助我从客户端执行此操作吗?

【问题讨论】:

    标签: c# .net asp.net-mvc wcf


    【解决方案1】:

    您可能已经知道,您的问题对许多人来说是个大问题。查找“幂等”和“webservice”。幂等性不仅仅意味着能够确保请求/响应,而且搜索将为您提供大量好东西可供阅读。

    如果“长时间停止响应”意味着几秒钟,而很少被调用,DarkWanderer 为此类问题展示了一个相当强力的解决方案。

    但是如果你有很多调用,睡眠可能会占用你的工作线程,所以你只需要依赖某种队列。

    如果您的调用是非事务性和非关键性的,您当然可以编写自己的队列机制。虽然这看起来很简单,但它可能仍然需要线程、复杂的回调、日志记录、主动错误处理等等。许多可怜的人报告说,最初的简单解决方案变成了维护的噩梦。

    现在我看到您的要求之一是它必须能够在应用程序池回收中存活下来。然后我们处于最后一类关键(可能是事务性)排队。

    为什么我会从一开始就推荐 MSMQ。它可以处理您的所有问题,并且 api 在 .net 中并且现在非常好。是的,它会增加您的整体解决方案的复杂性,但这源于您的问题域。

    【讨论】:

    • 我对 MSMQ 没有反感,但我 ahem 浏览的所有内容都提到了 MSMQ 中的队列到队列通信。你能指点我一个教程或指向正确方向的东西吗?
    • 有很多来源可供选择。而且由于我不知道您如何以及为什么调用该网络服务的具体细节,因此有很多选择。但基本上你的传入请求应该在队列中删除一条消息。然后您可以查看该消息的调用部分,如果成功将其从队列中删除。然后是使用队列的启动检查并确保进行所有服务调用。这是一个非常基本的架构。
    • 我仍然需要一个外部服务来监控队列,对吧?我的理解是MSMQ无法激活外部代码。
    • MSMQ 未重新激活。但正如我上面所描述的,您可以在应用程序中处理所有这些。冒着否定我的整个答案的风险,您实际上可以用数据库中的一个表来模拟这一点,并使用事务将该表视为一个队列。您也可以直言不讳地将失败的调用仅存储在此表/msmq 中。我仍然对您的应用程序上下文知之甚少,无法给出更好的答案
    • 谢谢。我只是希望那里有一些东西可以按计划激活我的代码,直到成功或严重失败。我最终会编写一个监视队列的守护程序,我不知道我是否会使用 MSMQ 或 DB 或其他东西,但你帮助我摆脱了我在重新发明轮子的感觉。听起来确实没有什么东西可以满足我的要求,而且它似乎也是一个非常常见、相当简单的要求。无论如何,对不起文字墙,你帮了我。
    【解决方案2】:
    while (true) {
        try {
            var response = webServiceClient.CallMethod();
            if (response.Successful())
                break;
            Sleep(retryInterval);
        } catch {}
    }
    

    这意味着,您只需要继续调用网络服务,不需要消息队列或其他东西。这能回答你的问题吗?

    【讨论】:

    • 好的,我没有添加我是从 Web 应用程序调用的。应用程序池可能会在此成功之前回收。用那条重要信息更新了我的问题。
    • 那么你需要一个简单的中间服务来充当消息队列。自己编写的实现比 MSMQ 更快,并且不需要更改服务器。
    猜你喜欢
    • 2019-05-04
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多