ReliableSessionBindingElement不支持传输模式Streamed

时间:2009-11-25 23:58:04

标签: c# wcf binding

我正在使用自定义绑定设计双工通道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和compositeDuplex绑定元素:

<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。

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

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

提前致谢。

4 个答案:

答案 0 :(得分:1)

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

哦,等等,有一个旋钮:

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

另见

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

答案 1 :(得分:1)

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

我已经检查了MSDN和众多论坛,但它们都导致死路一条。似乎 没有可靠的流量是可能的,或者反过来但是相反 到目前为止,我还没有找到两者结合的例子。

答案 2 :(得分:0)

我们已经构建了一个系统,用户可以在不使用流媒体的情况下上传和下载非常大的文件。

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

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

答案 3 :(得分:0)

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

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