了解WCF可靠的会话重试行为

时间:2009-10-07 12:21:46

标签: c# wcf ws-reliablemessaging

我有几个关于WCF可靠会话可靠性的问题:

  1. WCF是否在重试尝试期间重新序列化消息?

    <击> 2。如果1是正确的 - 它是否在消息参数被处理之后发生?3。如果2是正确的 - 是否有任何方法可以确定是否发送了消息?

  2. 我还不能通过反射器解决这个问题。

    UPD 1:我对服务器返回值更感兴趣。他们会怎么样?

    UPD 2:何时处理消息参数(准确地说 - 服务器回复)?收到适当的ack时会发生吗? 这就是我处理参数的意思:

    at MyNamespace.MyReply.Dispose()
       at System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore()
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessageCleanup(MessageRpc&amp;amp; rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp;amp; rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp;amp; rpc)
       at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
       at System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
       at System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
       at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
       at System.ServiceModel.Diagnostics.Utility.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
       at System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
       at System.ServiceModel.Diagnostics.Utility.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
       at System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
       at System.ServiceModel.Channels.InputQueue`1.AsyncQueueReader.Set(Item item)
       at System.ServiceModel.Channels.InputQueue`1.Dispatch()
       at System.ServiceModel.Channels.InputQueueChannel`1.Dispatch()
       at System.ServiceModel.Channels.ReliableReplySessionChannel.ProcessSequencedMessage(RequestContext context, String action, WsrmSequencedMessageInfo info)
    ...stack continues
    

    我需要使用它来处理服务器回复(我有另一个SOF主题,为什么我来到这个解决方案)。

    UPD 3:问题我试图解决的问题是似乎我的服务器回复首先被处置,然后应用程序尝试序列化它。我99%确定我不会在其他地方重复使用同一个对象。 Stacktraces非常难看,很大,可以在这里发布。

1 个答案:

答案 0 :(得分:7)

不,WCF 重新序列化消息。

这是(简化的):在会话期间,从客户端发送的每条消息都在客户端上进行缓冲。默认情况下,有32个消息的空间(可以调整;服务端也有缓冲区)。

然后将消息发送到服务器,如果它到达那里并且被分派,则服务器发送确认,客户端从缓冲区中删除消息。

但是,如果客户端发送消息#15和#16,然后获得#16的确认(但不是#15),则从缓冲区重新发送消息#15。

您可以配置很多选项,例如您是否需要订购交付,客户端应重试发送消息的次数等等。

查看这些文章和博客文章了解更多信息:

希望这有助于澄清一些事情

对响应的更新:取自我引用的第一篇文章(在MSDN上):

  

如果我们假设有一个请求/响应   沟通模式,响应   需要同样可靠地交付   作为要求,因此   响应方必须实施   启动机制非常好   类似于请求方   实现原始请求。   请求方反过来是   扮演接受者的角色   响应。如果回复丢失,他们   必须由回复方重新表达   因此它们也必须被缓存   (并承认)。两端都是   因此可靠的消息会话   为出站维护单独的缓存   和入站邮件。

所以是的,这同样适用于响应 - 只要我们有像NetTCP或HTTP这样的双向通信 - 如文章中提到的那样,它可以正常工作,如果有的话,它会变得有点棘手单向操作 - 有关详细信息,请参阅文章。

马克