La modalità di trasferimento in streaming non è supportata da ReliableSessionBindingElement

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

  •  05-07-2019
  •  | 
  •  

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top