5

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

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

    2. 如果 1 是正确的 - 是否在消息参数被处理后发生?
    3. 如果 2 是正确的 - 有什么方法可以确定消息是否已发送?

我还无法通过反射器弄清楚这一点。

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

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

at MyNamespace.MyReply.Dispose()
   at System.ServiceModel.Dispatcher.MessageRpc.DisposeParametersCore()
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessageCleanup(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& 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 非常丑陋而且很大,无法在此处发布。

4

1 回答 1

7

不,WCF 不会重新序列化消息。

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

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

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

您可以配置很多选项,例如是否要按顺序发送、客户端应该重试发送消息的次数等等。

查看这些文章和博客文章以获取更多信息:

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

更新回复:取自我引用的第一篇文章(在 MSDN 上):

如果我们假设具有请求/响应通信模式,则响应需要与请求一样可靠地传递,因此响应方必须实现与请求方为原始请求实现的机制非常相似的启动器机制。反过来,请求方扮演响应的接受者角色。如果响应丢失,响应方必须重新发送它们,因此它们也必须被缓存(并确认)。因此,可靠消息传递会话的两端都为出站和入站消息维护单独的缓存。

所以是的,这同样适用于响应——只要我们有像 NetTCP 或 HTTP 这样的双向通信,它就可以正常工作——正如文章中提到的那样,在单向的情况下它会变得有点棘手操作 - 详见文章。

马克

于 2009-10-07T12:27:06.930 回答