none
Передача потока на клиент RRS feed

  • Вопрос

  • Добрый день, возникла проблема с передачей потока на клиент. Задача в том, что у меня на сервере есть очень большая строка, и при передаче ее на клиент затрачивается очень много времени. Решил передавать потоком. Сервер поддерживает сессии и я не могу поставить transferMode="Streamed", а с transferMode="Buffered" клиент выкидывает исключение TimeLimit.

    Вот конфигурация сервера:

        <bindings>
          <netTcpBinding>
            <binding name="ServiceWcfNetTcp" closeTimeout="00:01:00" openTimeout="00:01:00"
              receiveTimeout="00:50:00" sendTimeout="00:50:00" transferMode="Buffered"
              maxReceivedMessageSize="1500000000" portSharingEnabled="false">
              <reliableSession enabled="true" />
              <security mode="None">
              </security>
            </binding>
          </netTcpBinding>
        </bindings>

    Вот на клиенте:

     <bindings>
                <netTcpBinding>
                    <binding name="NetTcpBinding_IServiceWcfTest" closeTimeout="00:01:00"
                        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                        transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                        hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                        maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                        maxReceivedMessageSize="65536">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <reliableSession ordered="true" inactivityTimeout="00:10:00"
                            enabled="true" />
                        <security mode="None">
                            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                            <message clientCredentialType="Windows" />
                        </security>
                    </binding>
                </netTcpBinding>
            </bindings>

    Если сделать transferMode="Streamed" все работает, только мне нужны сессии. Может быть есть другие пути решения данной проблемы или я где-то допустил ошибку?

    23 марта 2012 г. 11:19

Ответы

  • Добрый день.

    Вы всё верно сделали, но нельзя использовать сессии и потоки одновременно.

    Вот тут NetTcpBinding with Streaming and Session предложено решение данной проблемы, но оно достаточно нетривиальное.
    С разбиением всех операций на те, которые требуют потока и те которые не требуют, и дальнейшим разделением операций по двум разным контрактам.
    Соответственно один контракт сессии требует, другой нет, а для того что бы сессии всё таки работали предлагается перебрасывать GUID сессии... короче вам будет чем заняться :)



    • Изменено Alexandr Gashper 23 марта 2012 г. 12:01
    • Предложено в качестве ответа Abolmasov DmitryModerator 26 марта 2012 г. 9:30
    • Помечено в качестве ответа Artemy.Sh 27 марта 2012 г. 12:30
    23 марта 2012 г. 11:54
  • А что вам мешает это сделать? 

    Если я понял вас верно, вам надо передать строку с Сервера -> Клиенту.

    Надо увеличить maxReceivedMessageSize до необходимых вам значений. 
    maxBufferSize удалите из конфига т.к. для буферизованных транспортов, это значение всегда равно значению, указанному в maxReceivedMessageSize. Ни или присвойте обоим полям одинаковое значение (для наглядности).



    • Изменено Alexandr Gashper 23 марта 2012 г. 12:23
    • Предложено в качестве ответа Abolmasov DmitryModerator 26 марта 2012 г. 9:30
    • Помечено в качестве ответа Artemy.Sh 27 марта 2012 г. 12:30
    23 марта 2012 г. 12:20

Все ответы

  • Добрый день.

    Вы всё верно сделали, но нельзя использовать сессии и потоки одновременно.

    Вот тут NetTcpBinding with Streaming and Session предложено решение данной проблемы, но оно достаточно нетривиальное.
    С разбиением всех операций на те, которые требуют потока и те которые не требуют, и дальнейшим разделением операций по двум разным контрактам.
    Соответственно один контракт сессии требует, другой нет, а для того что бы сессии всё таки работали предлагается перебрасывать GUID сессии... короче вам будет чем заняться :)



    • Изменено Alexandr Gashper 23 марта 2012 г. 12:01
    • Предложено в качестве ответа Abolmasov DmitryModerator 26 марта 2012 г. 9:30
    • Помечено в качестве ответа Artemy.Sh 27 марта 2012 г. 12:30
    23 марта 2012 г. 11:54
  • А может быть можно передать большую строку без использования потоков? Максимальный размер данных будет около 5 Мб
    • Изменено Artemy.Sh 23 марта 2012 г. 12:05
    23 марта 2012 г. 12:01
  • А что вам мешает это сделать? 

    Если я понял вас верно, вам надо передать строку с Сервера -> Клиенту.

    Надо увеличить maxReceivedMessageSize до необходимых вам значений. 
    maxBufferSize удалите из конфига т.к. для буферизованных транспортов, это значение всегда равно значению, указанному в maxReceivedMessageSize. Ни или присвойте обоим полям одинаковое значение (для наглядности).



    • Изменено Alexandr Gashper 23 марта 2012 г. 12:23
    • Предложено в качестве ответа Abolmasov DmitryModerator 26 марта 2012 г. 9:30
    • Помечено в качестве ответа Artemy.Sh 27 марта 2012 г. 12:30
    23 марта 2012 г. 12:20
  • Уважаемый пользователь,

    Если чьи-либо сообщения являются решением проблемы или помогли вам в решении проблемы, то пожалуйста, не забывайте их помечать как ответ. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'.

    Спасибо.


    Для связи [mail]

    26 марта 2012 г. 9:30
    Модератор