Modo de transferência Streamed não é suportado por ReliableSessionBindingElement
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.
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.