Le mode de transfert Streamed n'est pas pris en charge par ReliableSessionBindingElement

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

  •  05-07-2019
  •  | 
  •  

Question

Je conçois un service wcf de canal duplex à l'aide d'une liaison personnalisée. Actuellement, lorsque je compile ma bibliothèque de classes, le message d'erreur suivant s'affiche:

  

Le mode de transfert Streamed n'est pas   supporté par   ReliableSessionBindingElement.

Ci-dessous mon 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'erreur que je reçois fait référence à ma liaison personnalisée, qui comporte à la fois des éléments de liaison reliableSession et 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>

Après quelques recherches, j'ai découvert que vous ne pouvez pas utiliser la diffusion en continu lorsque vous utilisez une messagerie fiable (WS-RM). En effet, WS-RM doit appliquer la signature / les sommes de contrôle à l’ensemble du message en tant qu’unité, etc. et cela n’est pas possible lorsqu’il est transféré en mode transfert, uniquement avec le mode transfert transféré.

Puisque je conçois un canal de liaison en duplex et que j'utilise ce service pour le téléchargement de gros fichiers, j'ai besoin de transferMode = streamed ET de l'élément de liaison de session fiable.

Quelqu'un sait-il comment attaquer cela? Pouvez-vous me montrer comment c'est fait?

Merci d'avance.

Était-ce utile?

La solution 2

Je commence à penser que la réponse à cette question peut être "impossible".

J'ai consulté MSDN et de nombreux forums et ils aboutissent tous à une impasse. Semble le streaming sans sureSession est possible ou l'inverse, mais si Jusqu'à présent, je n'ai pas été en mesure de trouver un exemple de la combinaison des deux.

Autres conseils

Si vous activez la sécurité (par exemple, SecurityMode = autre chose que Aucun), vous obtiendrez une session sur NetTcpBinding, je crois. Il peut également y avoir d'autres boutons pour fournir une session, ou vous pouvez créer une liaison personnalisée avec tcp en tant que transport et fiableSession en tant qu'élément de liaison. Je ne me souviens pas de tous les détails, mais j'espère que ce ne sont que des débutants.

Oh non attends, il y a un bouton pour cela:

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

Voir aussi

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

Nous avons mis au point un système permettant aux utilisateurs de télécharger et de télécharger des fichiers très volumineux sans utiliser la diffusion en continu.

La principale raison d’utiliser le streaming est son efficacité en termes de mémoire.

La seule chose dont vous avez vraiment besoin pour que cela fonctionne est de beaucoup de RAM. Vous devez également vous assurer que vous supprimez tous les objets correctement, car dans ce cas, des fuites de mémoire poseront des problèmes.

Je suggérerais de passer à une liaison en duplex permettant d'échanger plusieurs messages entre le client et le serveur. Puis divisez vos résultats en parties discrètes (afin de ne pas consommer une tonne de mémoire) et envoyez-les sous forme de réponses multiples par le canal duplex.

Avec le mode duplex, vous pouvez également activer un canal sécurisé et une session fiable, qui ne sont pas disponibles avec la liaison de streaming.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top