Modo de transferência Streamed não é suportado por ReliableSessionBindingElement

StackOverflow https://stackoverflow.com/questions/1800782

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu estou projetando um serviço de canal WCF duplex utilizando uma ligação personalizada. Atualmente, quando eu compilar meu biblioteca de classe, estou recebendo o seguinte erro:

Modo de transferência Streamed não é apoiado por ReliableSessionBindingElement.

Abaixo está a minha 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>

O erro que eu estou recebendo é referente à minha ligação personalizada que tem ambos os elementos de ligação reliableSession e 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>

Depois de algumas pesquisas, descobri que você não pode usar streaming de quando se utiliza mensagens confiável (WS-RM). Isso ocorre porque WS-RM precisa aplicar assinatura / somas de verificação para toda a mensagem como uma unidade, etc; e isso não é possível quando transmitido transferMode, apenas com transferMode tamponada.

Desde que eu estou projetando um duplex canal de ligação e eu estou usando este serviço para o upload de arquivos grandes, eu preciso transferMode = streaming E o elemento de ligação sessão confiável.

Alguém sabe como atacar isso? Você pode me mostrar como isso é feito?

Agradecemos antecipadamente.

Foi útil?

Solução 2

Eu estou começando a pensar que a resposta a esta pergunta pode ser "não é possível".

Eu verifiquei MSDN e inúmeros fóruns e todos eles levam a um beco sem saída. parece fluindo sem reliableSession é possível ou o contrário, mas tão agora eu não tenho sido capaz de encontrar um exemplo da combinação dos dois.

Outras dicas

Se você ativar a segurança (por exemplo SecurityMode = algo diferente de None) você vai ter uma sessão sobre NetTcpBinding, eu acredito. Também pode haver outros botões para fornecer uma sessão, ou você pode criar uma ligação com o TCP como um transporte e reliableSession como um elemento de ligação personalizada. Não me lembro de todos os detalhes, mas espero que essas são algumas entradas.

Oh nenhuma espera, há um botão para isso:

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

Veja também

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

Nós construímos um sistema onde os usuários podem fazer upload e download de arquivos muito grandes, sem o uso de streaming.

A principal razão para usar Streaming é que ele é eficiente de memória.

A única coisa que você realmente precisa para fazer o trabalho é muitos de RAM. Você também deve se certificar de que você dispor de todos os objetos corretamente como, neste caso, vazamentos de memória irá causar problemas.

Eu gostaria de sugerir a mudança para um duplex de ligação onde você pode trocar várias mensagens entre o cliente eo servidor. Então pedaço seus resultados em partes discretas (portanto, não consome uma tonelada de memória) e enviar como múltiplas respostas para baixo o canal duplex.

Com duplex você também pode habilitar canal seguro e confiável sessão, nenhum dos quais estão disponíveis com streaming de ligação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top