Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как настроить максимальный размер пакета для WCF сервиса.  (Прочитано 14525 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Raton
Новенький

ua
Offline Offline

« : 19-12-2010 12:33 » 

Добрый день.

Передаю файл по частям WCF сервису. При попытке передать за один раз более 8ми КБ вылетает с ошибкой not found.

Поис подсказал 3 настройки:
1. настройка привязки сервиса – параметры maxReceivedMessageSize, maxBufferSize и т.д;

2. указать в web.config значение атрибута maxRequestLength элемента <httpRuntime>;

3. в файле %windir%\System32\inetsrv\config\applicationHost.c onfig максимальный размер входящего запроса посредством секции <requestFiltering> и элемента <requestLimit>.

К сожалению все эти манипуляции ни к чему не привели.

Может есть еще какая хитрая настройка?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-12-2010 15:21 » 

Raton, на чём хостится сервис, каков транспортный протокол?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Raton
Новенький

ua
Offline Offline

« Ответ #2 : 20-12-2010 08:07 » 

Хоcтится на IIS7.
А вот протокол обмена  - я сам пытался найти, не нашел. Маловато опыта и понимания.
Учитывая что это SilverLight  - http. А вот тип сервиса,  вообще не знаю.

Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 20-12-2010 11:21 » new

WCF-сервис можно конфигурировать при помощи config-файла, и в коде. Зашитая в коде конфигурации, естественно, приводит к игнорированию config-файла.

Раз общественность молчит, наверно без анализа кода и конфигурационного файла не обойтись. Я лично с такой проблемой не сталкивался, хотя передавал через сервисы многомегабайтные файлы изображений.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Raton
Новенький

ua
Offline Offline

« Ответ #4 : 20-12-2010 12:50 » 

В коде настроек не обнаружил. Вот конфигурационный файл.
Код:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="104857600"/>

  </system.web>
 
  <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="false" />
          <dataContractSerializer maxItemsInObjectGraph="165535"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
   
    <bindings>

      <customBinding>
        <binding name ="PicReciever" maxBufferSize="104857600" maxReceivedMessageSize="104857600" receiveTimeout="00:10:00">
          <httpTransport maxBufferPoolSize="104857600" maxBufferSize="104857600" maxReceivedMessageSize="104857600"/>
        </binding>
      </customBinding>
    </bindings>
   
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    <services>
      <service name="PicReciever">
        <endpoint address="" binding="customBinding" bindingConfiguration="PicReciever" contract="IPicReciever"/>
      </service>

    </services>
  </system.serviceModel>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="104857600"/>
      </requestFiltering>
    </security>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <connectionStrings>
    <add connectionString="Server=STARODUBOV\SQLEXPRESS;Database=PicManager01;Integrated Security=true" name="PicManager" />
  </connectionStrings>
</configuration>


Еще мне подсказали следующее:
"У вас превышается размер внутреннего буфера WCF (xxxThreshold), используемого для сериализации. К сожалению я не знаю точного названия настройки. ".
Но вот что это за настройка я так и не нашел.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 20-12-2010 16:25 » 

Цитата: Raton
binding="customBinding"
Цитата: Raton
    <bindings>

      <customBinding>
        <binding name ="PicReciever" maxBufferSize="104857600" maxReceivedMessageSize="104857600" receiveTimeout="00:10:00">
          <httpTransport maxBufferPoolSize="104857600" maxBufferSize="104857600" maxReceivedMessageSize="104857600"/>
        </binding>
      </customBinding>
    </bindings>
Почему не стандартный WebHttpBinding или BasicHttpBinding?


Цитата: Raton
<httpRuntime maxRequestLength="104857600"/>
Сюда ещё можно добавить атрибут executionTimeout в секундах. Это время, которое IIS ждёт окончания обработки. Я не знаю, сколько длится обработка, так что не уверен, что это поможет.


Непонятно, каков интерфейс, и как передаётся файл. Строкой, массивом байтов? При сериализации объектов в XML происходит кодирование. Для больших объёмов байтовых данных MS рекомендует использовать MTOM (Message Transmission Optimization Mechanism). Чтобы его включить, в элемент
Цитата: Raton
<binding name ="PicReciever" maxBufferSize="104857600" maxReceivedMessageSize="104857600" receiveTimeout="00:10:00">
надо добавить атрибут messageEncoding="Mtom". Это даёт экономию трафика примерно на 30% для мегабайта. Или вообще Binary. Но я думаю, что это тоже не то.


В целом у WCF есть два режима работы: с использованием внутренних буферов (когда последовательно данные сначала сериализуются в буфер, а потом передаются) и потоковый (когда данные проходят все этапы обработки как на конвейере и голова данных начинает передаваться в то время, как хвост ещё не прошёл до конца сериализацию). Для включения потокового режима в конфигурации должно быть нечто вроде:
Код:
<system.serviceModel>
     …
    <bindings>
      <basicHttpBinding>
        <binding name="ExampleBinding" transferMode="Streaming"/>
      </basicHttpBinding>
    </bindings>
     …
<system.serviceModel>
Но этот режим передачи, если верить MSDN, работает только с WebHttpBinding или BasicHttpBinding (ну ещё для NetTcpBinding и NetNamedPipeBinding, но это тебе для веб-сервиса не подойдёт). И при этом функции в интерфейсе должны получать в аргументах и возвращать в результатах не массивы байтов или строки, а объекты типа Stream.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 20-12-2010 18:23 » 

Silverlight поддерживает только basicHttpBinding или customBinding на его основе.

Ах да, в 4 версии уже и netTcpBinding поддежривает
« Последнее редактирование: 20-12-2010 20:03 от yudjin » Записан
Raton
Новенький

ua
Offline Offline

« Ответ #7 : 21-12-2010 06:52 » 

Фух, оказалось все намного проще. Не знаю каким образом. Но я перепутал названия сервисов.
Хотя подсказки оказались тоже очень кстати.
Огромное спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines