2012-05-03 228 views
1

我正在使用MSMQ和WCF。现在,MSMQ可能会脱机,或者WCF与目标之间可能存在一些通信错误。 我知道我可以订阅serviceHost上的Faulted事件,当MSMQ发生故障时,我确实收到了该事件 - 非常棒。 但是,怎样才能知道发生的故障类型?我需要确定它是某种通信错误,如果是这样,我想在一段时间后重新连接,并继续尝试,直到达到“幻数”。WCF故障 - 哪种故障?

服务中没有抛出异常。只是当MSMQ离线时,WCF服务确实出现故障,但需要知道故障的类型。

感谢

+1

[在WCF中 - 在“Faulted”事件中 - 如何获取异常详细信息?](http://stackoverflow.com/questions/381345/in-wcf-in-the-faulted-event怎么做,我得到例外的细节) –

+0

不是很基督教,但谢谢。这是针对MSMQ的,但我之前在MSDN上看到过IErrorHandler文档,但是这是针对服务器端的,而不是客户端。 –

回答

1

如果它不是异常的详细信息,如基督教ķ表明,你正在寻找,而是为什么WCF服务/客户端没有收到其他通信异常,则原因是netMsmqBinding是实现“火&忘记”模式。

通过MSMQ管道,WCF服务与客户端完全断开连接,它只监听MSMQ目标队列上的消息。使用netMsmqBinding的服务操作必须配置为单向(返回void),因为一旦WCF客户端成功将消息放入MSMQ传出队列中,其工作就完成了。假设是MSMQ提供了保证消息传递给WCF服务。 MSMQ 4.0将处理您对“重新连接”和“幻数重试”的担忧。

+0

谢谢。我正在使用MSMQIntegratedBinding,而不是它有很大的不同。我明白了火,忘了。但我确实知道,当目标上的MSMQ处于脱机状态(订阅了serviceHost类的OnFaulted事件)时,该服务可能会出现故障。所以我知道它的故障,但我需要知道它的故障原因的例外或原因的类型,所以我可以做我自己的内部重试,尝试重新连接到离线的群集MSMQ,否则服务将无法接收那些来自MSMQ队列的消息,除非您手动重新启动它。 –

+0

群集MSMQ可以挑剔。我的客户使用它,但我没有参与设置它。根据我们的经验,一旦消息被MSMQ接受并放置在发起客户端机器的传出队列中,它就永远不会“丢失”。当某些服务器被定期关闭并且默认的生存时间段用尽时,我们在开发中遇到了问题,因此将消息转移到客户端计算机上的系统死信队列中。我不太明白想要重新尝试/重新连接的需要。 –

+0

这是因为在群集环境中,如果关闭其中一个节点,则群集MSMQ传播到另一个节点,这会断开WCF客户端(成为故障)。因此连接的客户端将失去连接并且不会接收消息,而是将消息放入队列中,直到您重新启动WCF应用程序为止。这就是为什么我想知道什么时候应用程序出现故障,并知道它是什么样的错误 –