6

我正在尝试使用 NetTcpBinding 设置 WcfService。我使用传输模式流式传输,因为我将传输大文件。我需要使用 Session,我已经读过 NetTcpBinding 支持这个,但是当我打开它时:

SessionMode=SessionMode.Required

我得到错误:

System.InvalidOperationException:合同需要 Session,但 Binding 'NetTcpBinding' 不支持它或未正确配置以支持它。

有谁知道我必须做什么才能使 NetTcpBinding 与会话一起工作?谢谢你的帮助 :)

4

1 回答 1

13

毫无疑问,您已经解决了这个问题-但是对于遇到它的其他人(就像我一样)...

根据 Juval Lowy 的“Programming WCF Services” - 您不能将流与配置为 SessionMode.Required 的合同一起使用。见第 243 页

您也不能将 NetTcpBinding 与可靠的流式消息传递一起使用。

它没有详细说明原因。

一种解决方法可能是将需要会话模式的操作拆分为单独的合同,并将流操作拆分为另一个合同。然后为每个客户端实现一个唯一 ID(客户端应用程序生命周期的唯一 GUID),该 ID 作为 RegisterSession(Guid mySessionId) 操作在非流接口中传递。在服务器上创建会话时 - 它们可以注册到会话管理器对象,该对象将 GUID、SessionContractImplementation 对存储在字典中。

然后将参数添加到流式合同操作(相同的 GUID),以便流式合同实现可以访问实时非流式对象(通过您创建的会话管理器 - 使用提供的 GUID)。

当然,您必须适当地管理会话生命周期。

从微软...

会话和流式传输 当您要传输大量数据时,WCF 中的流式传输模式是一种可行的替代方案,可以替代在内存中整体缓冲和处理消息的默认行为。使用基于会话的绑定流式传输呼叫时,您可能会遇到意外行为。所有流式调用都是通过一个不支持会话的通道(数据报通道)进行的,即使正在使用的绑定配置为使用会话也是如此。如果多个客户端通过基于会话的绑定对同一个服务对象进行流式调用,并且服务对象的并发模式设置为单一,并且其实例上下文模式设置为 PerSession,则所有调用都必须通过数据报通道,因此只有一个呼叫一次处理。然后一个或多个客户端可能会超时。

注意:
MaxConcurrentSessions 在这种情况下无效,因为只有一个“会话”可用。

请参阅http://msdn.microsoft.com/en-us/library/ms733040.aspx

于 2010-03-16T09:19:14.940 回答