我在 ac#MVC 项目中使用了一个臭名昭著的不可靠的 SOAP Web 服务。我无法控制该服务。它偶尔会长时间停止响应。有没有一种简单的方法,从客户端,以设定的时间间隔继续重试发送消息,直到我收到来自服务的响应?
我查看了 MSMQ 和 ws-reliability,但在我看来,这两个选项都需要对 Web 服务进行一些控制。有什么可以帮助我从客户端做到这一点吗?
我在 ac#MVC 项目中使用了一个臭名昭著的不可靠的 SOAP Web 服务。我无法控制该服务。它偶尔会长时间停止响应。有没有一种简单的方法,从客户端,以设定的时间间隔继续重试发送消息,直到我收到来自服务的响应?
我查看了 MSMQ 和 ws-reliability,但在我看来,这两个选项都需要对 Web 服务进行一些控制。有什么可以帮助我从客户端做到这一点吗?
正如您可能已经发现的那样,您的问题对许多人来说是一个大问题。查找“幂等”和“webservice”。幂等性不仅仅意味着能够确保请求/响应,而且搜索将为您提供大量好东西可供阅读。
如果“长时间停止响应”意味着几秒钟,而很少被调用,那么 DarkWanderer 为此类问题展示了一种非常强力的解决方案。
但是如果你有很多调用,睡眠可能会占用你的工作线程,所以你只需要依赖某种队列。
如果您的调用是非事务性的和非关键的,那么您当然可以编写自己的队列机制。虽然这看起来很简单,但它可能仍然需要线程、复杂的回调、日志记录、主动错误处理等等。许多可怜的人报告说,最初的简单解决方案变成了维护的噩梦。
现在我看到您的要求之一是它必须能够在应用程序池回收中存活下来。然后我们处于最后一类关键(可能是事务性)排队。
为什么我会从一开始就推荐 MSMQ。它可以处理您的所有问题,并且 api 在 .net 中并且现在非常好。是的,它会增加您的整体解决方案的复杂性,但这源于您的问题域。
while (true) {
try {
var response = webServiceClient.CallMethod();
if (response.Successful())
break;
Sleep(retryInterval);
} catch {}
}
这意味着,您只需要继续调用 Web 服务,不需要消息队列或其他东西。这是否回答你的问题?