我正在尝试使用 NetTcpBinding 设置 WcfService。我使用流式传输模式,因为我将传输大文件。我需要使用 Session,并且我已经读到 NetTcpBinding 支持此功能,但是当我打开它时,如下所示:
SessionMode=SessionMode.Required
我收到错误:
System.InvalidOperationException:合同需要会话,但绑定“NetTcpBinding”不支持它或未正确配置以支持它。
有谁知道我必须做什么才能使 NetTcpBinding 与会话一起工作?
谢谢你的帮助 :)
毫无疑问,你已经解决了这个问题 - 但对于遇到它的其他人(就像我一样)......
根据 Juval Lowy 的“编程 WCF 服务” - 您不能将流与配置为 SessionMode.Required 的合约一起使用。参见第 243 页
您也不能将 NetTcpBinding 与流式传输的可靠消息传递一起使用。
它没有详细说明原因。
一种解决方法可能是将需要会话模式的操作拆分为单独的合约,并将流操作拆分为另一个合约。
然后为每个客户端实现一个唯一的 ID(客户端应用程序生命周期的唯一 GUID),该 ID 作为 RegisterSession(Guid mySessionId) 操作在非流接口中传递。
当在服务器上创建会话时,它们可以向会话管理器对象注册,该对象将 GUID、SessionContractImplementation 对存储在字典中。
然后向流合同操作添加一个参数(相同的 GUID),以便流合同实现可以访问实时非流对象(通过您创建的会话管理器 - 使用提供的 GUID)。
当然,您必须适当地管理会话生命周期。
来自微软...
会话和流媒体
当需要传输大量数据时,WCF 中的流传输模式是在内存中缓冲和处理消息的默认行为的可行替代方案。使用基于会话的绑定流式传输调用时,您可能会出现意外行为。所有流调用都是通过不支持会话的单个通道(数据报通道)进行的,即使所使用的绑定配置为使用会话也是如此。如果多个客户端通过基于会话的绑定对同一服务对象进行流式调用,并且该服务对象的并发模式设置为 single,其实例上下文模式设置为 PerSession,则所有调用都必须通过数据报通道,因此只有一个一次处理呼叫。随后,一个或多个客户端可能会超时。您可以通过将服务对象的 InstanceContextMode 设置为 PerCall 或将 Concurrency 设置为 multiple 来解决此问题。
Note:
MaxConcurrentSessions 在这种情况下不起作用,因为只有一个“会话”可用。
See http://msdn.microsoft.com/en-us/library/ms733040.aspx http://msdn.microsoft.com/en-us/library/ms733040.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)