2012-03-14 3 views
1

Аналогичные вопросы текут, и я смотрю на них всех. Кажется, никто не решает мою проблему.большой файл через службу WCF

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

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

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

Вот подписи для контракта:

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

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

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

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

Форматировщик бросил исключение при попытке десериализации сообщения: Ошибки в десериализации тела сообщения запроса для операции «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. : Вызывает исключение, которое я написал в самом начале.

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

ответ

0

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

+0

спасибо за предложение. Не помогло. Мне кажется, что он просто игнорирует мою привязку и использует по умолчанию. Я не уверен, почему и как – Dmitry

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^