我正在尝试使用NetTcpBinding设置WcfService。我使用传输模式流式传输,因为我将传输大文件。我需要使用Session,并且我已经读过NetTcpBinding支持这个,但当我打开它时:
SessionMode=SessionMode.Required
我收到错误:
System.InvalidOperationException:Contract需要Session,但Binding'NetTcpBinding'不支持它,或者没有正确配置以支持它。
有谁知道我要做什么才能使NetTcpBinding与会话一起工作? 感谢您的帮助:))
答案 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在这种情况下没有效果,因为只有一个“会话”可用。