Режим передачи в потоковом режиме не поддерживается ReliableSessionBindingElement

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Я разрабатываю службу wcf для дуплексного канала, используя пользовательскую привязку. В настоящее время, когда я компилирую библиотеку классов, я получаю следующую ошибку:

  

Режим передачи в потоковом режиме не   поддерживается   ReliableSessionBindingElement.

Ниже мой 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>

Я получаю сообщение об ошибке, связанное с моей пользовательской привязкой, которая содержит элементы привязки reliableSession и композитный_дуплекс:

<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>

После некоторых поисков я обнаружил, что нельзя использовать потоковую передачу при использовании надежного обмена сообщениями (WS-RM). Это связано с тем, что WS-RM необходимо применять подпись / контрольные суммы ко всему сообщению как единое целое и т. Д .; и это невозможно при потоковой передаче TransferMode, только с буферизованным TransferMode.

Поскольку я разрабатываю канал дуплексной привязки и использую этот сервис для загрузки больших файлов, мне нужен TransferMode = streamed И надежный элемент привязки сеанса.

Кто-нибудь знает, как на это напасть? Можете ли вы показать мне, как это делается?

Заранее спасибо.

Это было полезно?

Решение 2

Я начинаю думать, что ответ на этот вопрос может быть "невозможен".

Я проверил MSDN и многочисленные форумы, и все они зашли в тупик. Кажется потоковая передача без надежного сеанса возможна или наоборот, но так До сих пор я не смог найти пример сочетания двух.

Другие советы

Если вы включите безопасность (например, SecurityMode = что-то отличное от None), я думаю, вы получите сеанс на NetTcpBinding. Также могут быть другие ручки для предоставления сеанса, или вы можете создать пользовательскую привязку с tcp в качестве транспорта и reliableSession в качестве элемента привязки. Я не помню все детали, но, надеюсь, это только некоторые из них.

О нет, подождите, есть ручка для этого:

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

Смотрите также

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

Мы создали систему, в которой пользователи могут загружать и скачивать очень большие файлы без потоковой передачи.

Основная причина использования потоковой передачи - это экономия памяти.

Единственное, что вам действительно нужно, чтобы это работало, - это много оперативной памяти. Вам также следует убедиться, что вы правильно утилизируете все объекты, так как в этом случае утечки памяти вызовут проблемы.

Я бы предложил перейти на дуплексную привязку, чтобы можно было обмениваться несколькими сообщениями между клиентом и сервером. Затем разбейте результаты на отдельные части (не тратя при этом тонны памяти) и отправьте несколько ответов по дуплексному каналу.

С помощью дуплекса вы также можете включить безопасный канал и надежный сеанс, ни один из которых не доступен с потоковой привязкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top