Клиент WCF — только первые 255 байтов потока, возвращаемого из службы WCF, содержат значения

Мне было поручено следить за приложением ASP.Net WebForms, которое взаимодействует со службой WCF, размещенной в службе Windows. Для службы используется привязка netTcpBinding.

Сервис предоставляет методы для загрузки и скачивания «файлов». Пользователь выбирает загрузку файла, и HttpPostFile.InputSteam передается непосредственно службе в качестве параметра в методе службы «Загрузить». Сервис сохраняет поток в виде массива байтов в базу данных [тип данных поля базы данных — varbinary (max)].

Поток данных загрузки файлов, по сути, является обратным процессом. Байты извлекаются из базы данных; загружается в MemoryStream в службе WCF; а затем вернулся в веб-приложение.

Я зафиксировал данные, содержащиеся в потоках (отправленных/полученных) на каждом этапе вышеописанных операций — на клиенте (веб-приложение) и сервисе. Я просмотрел и записал в плоский файл байты, содержащиеся в каждом потоке.

Массив байтов в каждом случае идентичен [byte value; и количество байтов в потоке], за исключением операции загрузки файла. В момент, когда поток возвращается в веб-приложение из службы WCF. Здесь количество полученных байтов правильное, но заполняются только первые 255 байтов. Значения остальных байтов равны нулю

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

У меня нет большого опыта в настройке правильных комбинаций атрибутов привязки (и других конфигураций) для клиентских и серверных приложений — в прошлом я полагался на значения по умолчанию. Нам нужно, чтобы сервис и клиент были настроены на передачу максимально допустимого размера файла. К сожалению, я не могу использовать MTOM.

Этот пост и ссылки не предлагали мне никаких на виду. До сих пор я не нашел никакой другой информации, которая помогает.

Надеюсь, кто-то может помочь мне с тем, что проблема может быть. Ниже приведены привязки, которые я использую:

Клиент [web.config]:

  <bindings>  
         <netTcpBinding>
            <binding name="TCP"  
                       closeTimeout="00:01:00" 
                       openTimeout="00:10:00"
                       receiveTimeout="00:01:00" sendTimeout="00:01:00" 
                       transferMode="Streamed" 
                       maxBufferPoolSize="512"
                       maxBufferSize="2147483647" 
                       maxConnections="10" 
                       maxReceivedMessageSize="2147483647">     

               <readerQuotas maxDepth="32" 
                             maxStringContentLength="2147483647" 
                             maxArrayLength="2147483647"
                             maxBytesPerRead="4096" 
                             maxNameTableCharCount="2147483647" />
               <reliableSession ordered="true" inactivityTimeout="00:10:00"
                 enabled="false" />
               <security mode="Transport">
                  <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                  <message clientCredentialType="Windows" />
               </security>
            </binding>
         </netTcpBinding>

Сервис:

<netTcpBinding>
        <binding name="netTCP"
                 closeTimeout="00:01:00"
                 openTimeout="00:01:00"
                 receiveTimeout="00:01:00" sendTimeout="00:01:00"
                 transferMode="Streamed"
                 listenBacklog="30"
                 maxBufferPoolSize="512"
                 maxBufferSize="2147483647"
                 maxConnections="30"
                 maxReceivedMessageSize="2147483647"
                 portSharingEnabled="true">
          <readerQuotas maxDepth="32"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="4096"
                        maxNameTableCharCount="2147483647" />
        </binding>
      </netTcpBinding>

person Grant Sutcliffe    schedule 12.09.2010    source источник
comment
Итак, вы абсолютно уверены, что нет ничего плохого в коде, который записывает байты в базу данных, и в коде, который считывает байты в MemoryStream?   -  person Ronald Wildenberg    schedule 12.09.2010
comment
Это происходит во время большой нагрузки или постоянно? ТАКЖЕ, не могли бы вы поставить подписи методов?   -  person Aliostad    schedule 12.09.2010
comment
Спасибо, ребята, за ваши ответы. Согласно моему «Ответу» на мой вопрос, проблема заключалась в том, что я не смог справиться с загрузкой буфера. Казалось, что метод stream.Read() может считывать в буфер максимум 255 байт за раз. Поэтому я просто справился с этим ограничением с помощью циклов, перехватывающих 255 данных для правильной загрузки буфера. Я не уверен, почему Stream.Read() ограничен 255; но.. пока, по крайней мере, я могу двигаться дальше.   -  person Grant Sutcliffe    schedule 12.09.2010


Ответы (1)


Я такой глупый. Я думаю, что понял.

Привязки были в порядке. Я не имел дело с правильным чтением байтов из потока в буфер на клиенте.

person Grant Sutcliffe    schedule 12.09.2010