Режим передачи в потоковом режиме не поддерживается ReliableSessionBindingElement - PullRequest
1 голос
/ 26 ноября 2009

Я разрабатываю службу 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, так и mixedDuplex:

<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 И надежный элемент привязки сеанса.

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

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

Ответы [ 4 ]

1 голос
/ 29 ноября 2009

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

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

1 голос
/ 26 ноября 2009

Если вы включите безопасность (например, 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

0 голосов
/ 21 июня 2011

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

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

0 голосов
/ 28 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...