NetTcpBinding与Streaming和Session

时间:2010-01-05 09:18:10

标签: session streaming wcf nettcpbinding

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

SessionMode=SessionMode.Required

我收到错误:

System.InvalidOperationException:Contract需要Session,但Binding'NetTcpBinding'不支持它,或者没有正确配置以支持它。

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

1 个答案:

答案 0 :(得分:11)

毫无疑问,你已经解决了这个问题 - 但是遇到它的其他人(正如我所做的那样)......

根据Juval Lowy的“编程WCF服务” - 您无法使用配置为SessionMode.Required的合同进行流式处理。见第243页

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

没有详细说明原因。

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

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

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

来自微软......

  

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

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

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