большой файл через сервис WCF - PullRequest
1 голос
/ 14 марта 2012

Подобные вопросы возникают вокруг, и я посмотрел на все из них. Похоже, никто не решил мою проблему.

- ОБНОВЛЕНИЕ: -

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

using (var cw = new WCFClientWrapper<ICommonService>())
{
    cw.Channel.DocumentInsert(content, filename, contentType);
}

Вот подпись под контрактом:

[OperationContract]
void DocumentInsert(byte[] content, string fileName, string contentType);

Обратите внимание, что я передаю байтовый массив для содержимого, поскольку это то, что нужно передать для хранения вещей в БД.

- Конец обновления -

Я могу успешно загрузить небольшой файл (пара кб). Однако, когда я пытаюсь загрузить что-то большее (20 КБ), я получаю исключение:

Средство форматирования выдало исключение при попытке десериализации сообщение: ошибка в десериализации тела сообщения запроса на операцию 'DocumentInsert. Максимальная квота длины массива (16384) была превышено при чтении данных XML. Эта квота может быть увеличена на изменение свойства MaxArrayLength в XmlDictionaryReaderQuotas объект, используемый при создании читателя XML. Строка 1, позиция 31774.

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

Клиент:

<system.serviceModel>

    <behaviors>
      <endpointBehaviors>
        <behavior name="SecureBehavior">
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="WSHttpBinding_Service" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="262144" messageEncoding="Text"
          textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="5242880" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <client>
      <endpoint address="http://dev.svc.someurl.com/CommonService.svc"
                binding="basicHttpBinding"
                bindingConfiguration="WSHttpBinding_Service"
                behaviorConfiguration="SecureBehavior"
                contract="MyApp.Contracts.ServiceContracts.ICommonService"
                name="MyApp.Contracts.ServiceContracts.ICommonService">
      </endpoint>
    </client>

  </system.serviceModel>

Услуги:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="MyBasicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <services>
      <service name="MyApp.WCFServices.CommonService">
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="MyBasicHttpBinding"
                  contract="MyApp.Contracts.ServiceContracts.ICommonService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
      <service name="MyApp.WCFServices.AccountService">
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="MyBasicHttpBinding"
                  contract="MyApp.Contracts.ServiceContracts.IAccountService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Прикрепление диагностики показывает:

  • Служба построения : без ошибок / предупреждений
  • Открыть службу : предупреждение - контекст оценки конфигурации не найден - соответствующий тег не найден. Добавлены конечные точки по умолчанию.
  • Слушайте на 'http://dev.svc.someurl.com/CommonService.svc': нет ошибки / предупреждения
  • Обработка сообщения 1 : без ошибок / предупреждений
  • Действие обработки 'http://tempuri.org/ICommonService/DocumentInsert'. : выдает исключение, которое я написал в самом начале.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Хорошо, после дня борьбы я наконец нашел проблему.Мне просто нужно было убедиться, что имя тега в WCF web.config совпадает с пространством имен и именем службы:

<service name="ServicesImplementation.WcfServices.CommonService">

К сожалению, вы, ребята, не увидели это на основании информациичто я предоставил.

0 голосов
/ 14 марта 2012

Я сталкивался с тем же исключением несколько месяцев назад.Для отправки / получения больших данных в / из службы WCF необходимо установить transferMode="Streamed".Когда используется Transfermode в качестве Buffered, он фактически помещает весь файл в память перед загрузкой / загрузкой.Поэтому большой размер буфера требуется как для веб-клиента, так и для узла службы WCF. При этом потоковые передачи могут улучшить масштабируемость службы, устраняя необходимость в больших буферах памяти.Дополнительную информацию о режиме передачи см. В статье MSDN Перечисление TransferMode

...