【问题标题】:NetTcpBinding with Streaming and Session带有流和会话的 NetTcpBinding
【发布时间】:2010-01-05 09:18:09
【问题描述】:

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

SessionMode=SessionMode.Required

我得到错误:

System.InvalidOperationException:合同需要 Session,但 Binding 'NetTcpBinding' 不支持它或未正确配置以支持它。

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

【问题讨论】:

    标签: session streaming wcf nettcpbinding


    【解决方案1】:

    毫无疑问,你已经解决了这个问题 - 但对于遇到它的其他人(就像我一样)......

    根据 Juval Lowy 的“Programming WCF Services” - 您不能将流式传输与配置为 SessionMode.Required 的合同一起使用。见第 243 页

    您也不能将 NetTcpBinding 用于可靠的流式消息传递。

    没有详细说明原因。

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

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

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

    来自微软...

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

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

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

    【讨论】:

    • 如何向流合同添加 GUID 参数?我得到一个 InvalidOperationException:对于操作上传中的请求要成为一个流,该操作必须有一个类型为 Stream 的参数。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2010-11-20
    • 2023-03-13
    • 2012-10-20
    • 1970-01-01
    • 2015-02-04
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多