我有几个关于WCF可靠会话可靠性的问题:
WCF是否在重试尝试期间重新序列化消息?
2.如果1是正确的 - 消息参数处理后是否发生?
3.如果2是正确的 - 是否有任何方法可以确定是否已发送消息?
我还想通过反射器来解决这个问题.
UPD 1:我对服务器返回值更感兴趣.他们会怎么样?
UPD 2:何时处理消息参数(准确地说 - 服务器回复)?收到适当的ack时会发生吗?这是我处理参数的意思:
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非常丑陋而且很大,可以在这里发布.
不,WCF并没有重新序列化的消息.
会发生什么(简化):在会话期间,从客户端发送的每条消息都在客户端上进行缓冲.默认情况下,有32个消息的空间(这可以调整;服务端也有一个缓冲区).
然后将消息发送到服务器,如果它到达那里并且被分派,则服务器发送确认,客户端从缓冲区中删除消息.
但是,如果客户端发送消息#15和#16,然后获得#16的确认(但不是#15),则从缓冲区重新发送消息#15.
您可以配置很多选项,例如您是否需要订购交付,客户端应重试发送消息的次数等等.
查看这些文章和博客文章了解更多信息:
使用Windows Communication Foundation可靠消息简介
WCF:可靠的消息传递
Reliable Messaging如何工作
WCF会话和可靠消息传递
WCF从上到下的截屏视频; 可靠的消息传递
希望这有助于澄清一些事情
响应更新:取自我引用的第一篇文章(在MSDN上):
如果我们假设具有请求/响应通信模式,则响应需要与请求一样可靠地传递,因此响应方必须实现与请求方为原始请求实现的非常类似的启动器机制.反过来,请求方正在扮演响应的接受者角色.如果响应丢失,则必须由响应方重新发送,因此它们也必须被缓存(并确认).因此,可靠消息传递会话的两端都为出站和入站消息维护单独的高速缓存.
所以是的,同样适用于响应 - 只要我们通过NetTCP或HTTP进行双向通信 - 如文章中所提到的那样工作正常,如果是单向的话,它会变得有点棘手操作 - 有关详细信息,请参阅文章.
渣