C# ReliableSessionBindingElement不支持流传输模式

C# ReliableSessionBindingElement不支持流传输模式,c#,wcf,binding,C#,Wcf,Binding,我正在设计一个使用自定义绑定的双工通道wcf服务。目前,当我编译类库时,我得到以下错误: 传输模式流式传输不可用 支持 ReliableSessionBindingElement 下面是我的App.config: <service behaviorConfiguration="transferServiceBehavior" name="API.FileTransfer.FileTransferService"> <endpoin

我正在设计一个使用自定义绑定的双工通道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>

我遇到的错误是指我的自定义绑定,它同时具有reliableSession和CompositedPlex绑定元素:

<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和可靠的会话绑定元素

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

提前感谢。

如果您打开安全性(例如,SecurityMode=除None之外的其他内容),我相信您将在NetTcpBinding上获得一个会话。还可能有其他旋钮提供会话,或者您可以创建一个自定义绑定,其中tcp作为传输,reliableSession作为绑定元素。我不记得所有的细节,但希望这些是一些先发者

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

另见


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

使用流媒体的主要原因是它具有内存效率


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

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

我检查了MSDN和许多论坛,它们都导致了死胡同。似乎 没有reliableSession的流媒体是可能的,反之亦然
到目前为止,我还没有找到两者结合的例子

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


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

谢谢。我尝试了你的定制建议,并用结果更新了我的问题。我的配置中有什么可疑的地方吗?布莱恩-根据我的问题更新,还有什么建议吗?再次感谢。谢谢设拉子,我很好奇你到底做了什么。但是,就我们眼前的目的而言,我们确实需要一个解决方案来解决发布的问题,因为在当前的体系结构中已经花费了大量的时间和精力。这有点简化,但假设有100个用户同时下载一个10MB的文件。内存只有1GB,如果您有16GB的服务器,没有问题。好的,谢谢。有道理。现在,我们将关注当前的架构,如果你有任何想法,请告诉我!谢谢你的意见。从这个问题没有答案(以及互联网上没有内容)来看,我猜我会把“不可能”作为答案。我会把这个留几天,以防万一。。。