La modalità di trasferimento in streaming non è supportata da ReliableSessionBindingElement
Domanda
Sto progettando un servizio wcf di canale duplex utilizzando un'associazione personalizzata. Attualmente, quando compilo la mia libreria di classi, ricevo il seguente errore:
La modalità di trasferimento in streaming non lo è sostenuto da ReliableSessionBindingElement.
Di seguito è la mia 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>
L'errore che sto ricevendo si riferisce alla mia associazione personalizzata che ha elementi di associazione sia affidabileSession che 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>
Dopo alcune ricerche, ho scoperto che non è possibile utilizzare lo streaming quando si utilizza la messaggistica affidabile (WS-RM). Questo perché WS-RM deve applicare la firma / checksum all'intero messaggio come unità, ecc .; e questo non è possibile quando streamingMode è trasferito, solo con TransferMode bufferizzato.
Dal momento che sto progettando un canale di bind duplex e sto usando questo servizio per il caricamento di file di grandi dimensioni, ho bisogno di transferMode = streaming E l'elemento affidabile di bind della sessione.
Qualcuno sa come attaccarlo? Puoi mostrarmi come è fatto?
Grazie in anticipo.
Soluzione 2
Sto iniziando a pensare che la risposta a questa domanda potrebbe essere "non possibile".
Ho controllato MSDN e numerosi forum e tutti portano a un vicolo cieco. sembra lo streaming senza affidabilitàSession è possibile o viceversa, ma così finora non sono stato in grado di trovare un esempio della combinazione dei due.
Altri suggerimenti
Se attivi la sicurezza (ad es. SecurityMode = qualcosa di diverso da None) otterrai una sessione su NetTcpBinding, credo. Potrebbero esserci anche altre manopole per fornire una sessione, oppure è possibile creare un'associazione personalizzata con tcp come trasporto e affidabileSession come elemento di associazione. Non ricordo tutti i dettagli, ma speriamo che questi siano alcuni antipasti.
Oh no aspetta, c'è una manopola per questo:
http://msdn.microsoft.com /en-us/library/system.servicemodel.nettcpbinding.reliablesession.aspx
Vedi anche
http://blogs.msdn.com/drnick /archive/2006/06/05/617703.aspx
Abbiamo creato un sistema in cui gli utenti possono caricare e scaricare file molto grandi, senza utilizzare lo streaming.
Il motivo principale per utilizzare lo streaming è che è efficiente in termini di memoria.
L'unica cosa di cui hai veramente bisogno per farlo funzionare è molti di RAM. Dovresti anche assicurarti di smaltire correttamente tutti gli oggetti poiché in questo caso le perdite di memoria causeranno problemi.
Suggerirei di passare a un'associazione duplex in cui è possibile scambiare più messaggi tra client e server. Quindi suddividere i risultati in parti discrete (quindi non consumando una tonnellata di memoria) e inviare come risposte multiple lungo il canale duplex.
Con il duplex è anche possibile abilitare il canale sicuro e la sessione affidabile, nessuno dei quali è disponibile con lo streaming binding.