Cap*_*gan 5 streaming session wcf nettcpbinding
我正在尝试使用NetTcpBinding设置WcfService.我使用传输模式流式传输,因为我将传输大文件.我需要使用Session,我已经读过NetTcpBinding支持这个,但当我打开它时:
SessionMode=SessionMode.Required
Run Code Online (Sandbox Code Playgroud)
我收到错误:
System.InvalidOperationException:Contract需要Session,但Binding'NetTcpBinding'不支持它,或者没有正确配置以支持它.
有谁知道我必须做什么才能使NetTcpBinding与会话一起工作?谢谢你的帮助 :)
Mar*_*son 11
毫无疑问,你已经解决了这个问题 - 但对于遇到它的其他人(正如我所做的那样)......
根据Juval Lowy的"编程WCF服务" - 您无法使用配置为SessionMode.Required的合同进行流式处理.见第243页
您也不能使用NetTcpBinding与流式传输进行可靠的消息传递.
它没有详细说明原因.
一种解决方法可能是将需要会话模式的操作拆分为单独的合同,将流操作拆分为另一个.然后为每个客户端实现一个唯一的ID(客户端应用程序生命周期的唯一GUID),该ID在非流式接口中作为RegisterSession(Guid mySessionId)操作传递.在服务器上创建会话时 - 它们可以向会话管理器对象注册,该对象在Dictionary中存储GUID,SessionContractImplemenation对.
然后向流合同操作添加一个参数(相同的GUID),以便流合同实现可以访问实时非流对象(通过您创建的会话管理器 - 使用提供的GUID).
当然,您必须适当地管理会话生存期.
来自微软......
会话和流式传输当您需要传输大量数据时,WCF中的流式传输模式是一种可行的替代方法,可以完全缓存和处理内存中的消息.使用基于会话的绑定进行流式呼叫时,您可能会遇到意外行为.所有流式呼叫都是通过单个通道(数据报通道)进行的,即使正在使用的绑定配置为使用会话,也不支持会话.如果多个客户做出流调用了一个基于会话的绑定和服务对象的并发模式设置为单和实例上下文模式设置为PerSession,所有的呼叫都必须通过数据报通道,因此只有一个相同的服务对象呼叫一次处理.然后,一个或多个客户可以超时.您可以通过将服务对象的InstanceContextMode设置为PerCall或Concurrency为multiple来解决此问题.
注意:
MaxConcurrentSessions在这种情况下没有效果,因为只有一个"会话"可用.
请参阅http://msdn.microsoft.com/en-us/library/ms733040.aspx