【问题标题】:Transfer mode Streamed is not supported by ReliableSessionBindingElementReliableSessionBindingElement 不支持传输模式流式传输
【发布时间】:2009-11-25 23:58:03
【问题描述】:

我正在使用自定义绑定设计双工通道 wcf 服务。目前,当我编译我的类库时,出现以下错误:

传输模式流式不是 支持 ReliableSessionBindingElement。

下面是我的 App.config:

<service behaviorConfiguration="transferServiceBehavior" 
               name="API.FileTransfer.FileTransferService">
        <endpoint address="json" 
                  behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" 
                  bindingConfiguration="jsonWeb" 
                  name="MyJSONFileTransferEP"
                  contract="API.FileTransfer.IJSONFileTransferService" />
        <endpoint address="pox" 
                  behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" 
                  bindingConfiguration="poxWeb" 
                  name="MyPOXFileTransferEP"
                  contract="API.FileTransfer.IPOXFileTransferService" />
        <endpoint address="soap" 
                  behaviorConfiguration="NetTcpEPBehavior"
                  binding="netTcpBinding" 
                  bindingConfiguration="netTcpWeb" 
                  name="MySOAPFileTransferEP"                   
                contract="API.FileTransfer.ISOAPFileTransferService" />
        <endpoint address="mex" 
                  binding="mexTcpBinding" 
                  bindingConfiguration=""
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:2544/filetransfer/" />
            <add baseAddress="net.tcp://localhost:2544/filetransfer/" />
          </baseAddresses>
        </host>
</service>

我得到的错误是指我的自定义绑定,它同时具有可靠会话和复合双工绑定元素:

<customBinding>
    <binding name="netTcpCustom" 
             closeTimeout="00:01:00"
             openTimeout="00:01:00"
             receiveTimeout="00:10:00"
             sendTimeout="00:01:00">
      <reliableSession />
      <compositeDuplex />
      <oneWay />
      <windowsStreamSecurity protectionLevel="None" />
      <mtomMessageEncoding  />
      <tcpTransport maxBufferPoolSize="524288"
                    maxReceivedMessageSize="2147483647" 
                    connectionBufferSize="8192"
                    hostNameComparisonMode="StrongWildcard" 
                    channelInitializationTimeout="00:01:00"
                    maxBufferSize="2147483647" 
                    maxPendingConnections="20" 
                    maxOutputDelay="00:00:00.2000000"
                    maxPendingAccepts="5" 
                    transferMode="Streamed" 
                    listenBacklog="20"
                    portSharingEnabled="false" 
                    teredoEnabled="false">
        <connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
            idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
      </tcpTransport>
    </binding>
  </customBinding>

经过一番搜索,我发现在使用可靠消息传递 (WS-RM) 时不能使用流式传输。这是因为 WS-RM 需要将签名/校验和作为一个整体应用于整个消息等;这在流传输模式时是不可能的,只有缓冲传输模式。

由于我正在设计一个双工绑定通道并且我正在使用此服务来上传大文件,因此我需要 transferMode = streamed 和可靠的会话绑定元素。

有人知道如何攻击这个吗?你能告诉我它是怎么做的吗?

提前致谢。

【问题讨论】:

    标签: c# wcf binding


    【解决方案1】:

    如果您打开安全性(例如 SecurityMode=非无),我相信您将获得一个有关 NetTcpBinding 的会话。也可能有其他旋钮来提供会话,或者您可以创建一个自定义绑定,使用 tcp 作为传输,reliableSession 作为绑定元素。我不记得所有细节,但希望这些是一些初学者。

    哦,不用等,有一个旋钮:

    http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.reliablesession.aspx

    另见

    http://blogs.msdn.com/drnick/archive/2006/06/05/617703.aspx

    【讨论】:

    • 谢谢布赖恩。我尝试了您的自定义绑定建议,并用结果更新了我的问题。我的配置中有什么看起来可疑的地方吗?
    • Brian - 根据我的问题更新有什么进一步的建议吗?再次感谢。
    【解决方案2】:

    我开始认为这个问题的答案可能是“不可能的”。

    我检查了 MSDN 和许多论坛,它们都导致了死胡同。似乎 没有可靠会话的流式传输是可能的,或者相反,但是这样 到目前为止,我还没有找到两者结合的例子。

    【讨论】:

    • 从对这个问题没有回复(以及互联网上缺乏内容)来看,我猜我会将“不可能”标记为答案。以防万一……
    【解决方案3】:

    我们已经建立了一个系统,用户可以上传和下载非常大的文件,而无需使用流媒体。

    使用流式传输的主要原因是内存效率高。

    你真正需要让它工作的唯一东西是很多 RAM。您还应该确保正确处理所有对象,因为在这种情况下内存泄漏会导致问题。

    【讨论】:

    • 谢谢 Shiraz,我会很好奇你做了什么。但是,为了我们的直接目的,我们确实需要一个解决已发布问题的解决方案,因为当前架构已经投入了大量时间和精力。
    • 我们的服务器只有足够的 RAM。这有点简化,但是假设您有 100 个用户同时下载一个 10 MB 的文件。这只是 1 GB 的内存,如果您有一个 16 GB 的服务器没有问题。
    • 好的,谢谢。说得通。好吧,现在,我们将专注于当前的架构,所以如果您有任何想法,请告诉我!感谢您的意见。
    【解决方案4】:

    我建议更改为双工绑定,您可以在客户端和服务器之间交换多条消息。然后将您的结果分成离散的部分(因此不会消耗大量内存)并作为多个响应发送到双工通道。

    使用双工,您还可以启用安全通道和可靠会话,这两者都不适用于流式绑定。

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2014-02-15
      • 2021-02-26
      • 1970-01-01
      相关资源
      最近更新 更多