我正在尝试使用WcfService设置一个NetTcpBinding。我使用传输模式流,因为我将传输大文件。我需要使用Session,我已经读过NetTcpBinding支持它,但是当我打开它时,如下所示:
SessionMode=SessionMode.Required我知道错误:
System.InvalidOperationException:契约需要会话,但是绑定'NetTcpBinding‘不支持它,或者没有正确配置来支持它。
有人知道我要做什么才能让NetTcpBinding与会话一起工作吗?(谢谢你的帮助:)
发布于 2010-03-16 09:19:14
毫无疑问,你已经解决了这个问题--但是对于其他遇到它的人来说(就像我一样).
根据Juval的“编程WCF服务”,您不能使用配置为SessionMode.Required的合同流。见第243页
您也不能使用NetTcpBinding与流一起进行可靠的消息传递。
但并没有详细说明原因。
一个解决方法可能是将需要会话模式的操作拆分为单独的契约,将流操作拆分为另一个。然后为每个客户端实现一个唯一ID (客户端应用程序生存期的惟一GUID ),该ID作为RegisterSession(Guid mySessionId)操作在非流接口中传递。当在服务器上创建会话时,它们可以向会话管理器对象注册,该对象将GUID、SessionContractImplemenation对存储在字典中。
然后向流合同操作(相同的GUID)添加一个param,以便流契约实现可以访问活动的非流对象(通过您创建的会话管理器--使用提供的GUID )。
当然,您必须适当地管理会话生命周期。
来自微软..。
当您有大量的数据要传输时,
中的流传输模式是完全缓冲和处理内存中消息的默认行为的一种可行的选择。当使用基于会话的绑定进行流调用时,可能会出现意外的行为。所有流调用都是通过一个不支持会话的单一信道(数据报信道)进行的,即使使用的绑定被配置为使用会话。如果多个客户端通过基于会话的绑定对同一个服务对象进行流调用,并且服务对象的并发模式被设置为单个,并且其实例上下文模式被设置为PerSession,则所有调用都必须通过数据报信道,因此一次只能处理一个调用。然后,一个或多个客户可能会超时。可以通过将服务对象的InstanceContextMode设置为PerCall或将并发设置为多个来解决此问题。
注意:
在这种情况下,MaxConcurrentSessions没有任何效果,因为只有一个可用的“会话”。
请参阅http://msdn.microsoft.com/en-us/library/ms733040.aspx
https://stackoverflow.com/questions/2005020
复制相似问题