在WCF可靠请求回复服务方法中进行回复时,如何处理失败

时间:2012-06-04 03:14:05

标签: c# .net wcf ws-reliablemessaging

在可靠的请求回复中,我理解回复是公认的,可靠的。如果由于某种原因,所有8次尝试(默认重试次数为8次)的回复消息不断失败,则该频道将出现故障。

在服务器端服务方法中,如果回复失败,我需要采取行动,但我无法看到如何实现这一点,因为服务方法不知道WCF上下文。

    /// <summary>
    /// This is my service method, and does the reply in reliable request reply
    /// </summary>
    /// <returns></returns>
    public IModelJob GetNextJob()
    {
        //dequeue the next item if there is any
        var modelJob = _priorityQueue.Dequeue();

        //if all attempts to reply fail (or at least fail to be acknowledged) then when and how do I get a chance to requeue this job?
        return modelJob;

    }

当您是客户端并在代理本身上调用服务方法时,似乎更容易处理失败,因为您可以从ClientBase实现自己的代理。

我已阅读:http://msdn.microsoft.com/en-us/library/aa480191.aspx,并进行了搜索,但未发现具体内容。

1 个答案:

答案 0 :(得分:0)

根据您最终支持的业务运营来考虑它。例如,如果服务期望从客户端以30分钟的间隔定期发送一系列消息,那么您可能需要(在商业意义上)如果在120​​分钟内未看到消息,则服务应通知管理员。这将在驱动您的服务的业务逻辑中实现。

WCF的一个缺点是,当它没有收到消息时你不能让它抛出一个异常 - 它怎么会知道它应该首先期待一个呢?

请记住,Reliable Messaging在应用程序下面的一层工作,就像在没有HTTP应用程序完全了解的情况下进行TCP重新传输一样。事实上,在TCP级别需要重传或几次重传,这不是接收者的关注,并且当然不会在协议栈上引发异常。它取决于数据的发送者,以最终检测到数据无法发送,并对其采取一些措施。或者,在我给出的示例中,针对服务背后的业务逻辑,以在业务级别实现需求。

您可能对我撰写的关于WS-ReliableMessaging的一些缺点的blog post感兴趣。