我想实现一个非常基本的可靠消息状态处理系统在我的Silverlight来WCF服务器之间的通信提供更高的可靠性。

我已引入自定义消息报头插入到包含一个递增的整数作为消息ID的SOAP请求的路由。我们的想法是,当我收到的WCF服务器的请求,我要检查的消息ID。如果ID>最后的ID,那么我只需执行请求,并请求后,我缓存结果的副本,新的ID一起。

如果该ID是==的lastID,我假定客户端从未收到消息,我想简单地返回cache'd响应对象,而不是重新处理该请求的。我写了我注入到WCF端点行为一个MessageInspector行为对象。此对象实现IDispatchMessageInspector,其具有2种方法:

object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
    // Get the incoming message headers and get the messageId
    var idx = request.Headers.FindHeader("ClientRequestId", "");
    if (idx >= 0)
    {
        var requestHeader = request.Headers[idx];
        int requestId = 0;
        if (Int32.TryParse(requestHeader.ToString(), out requestId))
        {
            int lastRequest = myCache.GetLastId();
            if (requestId <= lastRequest)
            {
                // @TODO - Send back the saved message
                var reply = myCache.GetLastResponse();
                if (reply != null)
                {
                    /// ERK -- > Woops, how do I override the service
                    /// and make the reply here?
                }
            }
            myCache.SetLastId(requestId);
        }
    }
    return null;
}

void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
    var requestId = myCache.GetLastId();
    if (requestId > 0)
    {
        myCache.SetLastResponse(reply);
    }
}

好了,我遇到了这个问题应该是显而易见的......的AfterReceiveRequest返回值(对象)是传递给BeforeSendReply为“correlatedState”的值。并非如我最初的预期,为请求新的返回值。现在的问题是,我可以停止从处理该消息服务在这个位置,并返回一个“缓存”的反应?

实际上,更好的版本这个问题:这是相应的“注射”位置来处理高速缓存和响应跟踪?如果没有,哪里将是“批准MS”或完成这个请求跟踪和恢复的更好的方法?

感谢。

-Jeff

有帮助吗?

解决方案 2

在许多试验和苦难,我发现我的问题的解决方案,如果不雅致,是功能性的。

为了绕过该呼叫到服务端点,当我检测重复的服务请求时,我简单地抛出一个的的FaultException 即可。然后在 BeforeSendReply 方式,我检查是否<强> replay.IsFault ,然后如果故障是特定故障代码我在扔的 AfterReceiveRequest 即可。如果是这样,我返回消息响应的缓存副本。在的FaultException 的机制是什么,我需要使用绕过的服务电话。

如果有人想这个解决方案完整的工作代码,这里掉落一张纸条,我会后我的最终代码后,我完成最后的调试和单元测试。

-Jeff

其他提示

我想你想稍微这里重新发明轮子。 WCF拥有,旨在确保消息的传送已经可靠消息。我想尝试的是,除非这是你不想使用它的具体原因是什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top