WCF maxReceivedMessageSize не читается из конфигурации - PullRequest
16 голосов
/ 28 августа 2009

У меня есть следующий app.config на стороне сервера для службы WCF:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="default" maxReceivedMessageSize="5000000">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Core.TOAService.Service1Behavior"
        name="Core.TOAService.TOAService">
        <endpoint address="" binding="wsHttpBinding" contract="Core.TOAService.ITOAService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/Core.TOAService/TOAService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Core.TOAService.Service1Behavior">
          <!-- 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>
  </system.serviceModel>

Когда я пытаюсь передать этой службе большой файл (всего ~ 250 КБ), в файле svclog регистрируется исключение:

Максимальная квота размера сообщения для входящих сообщений (65536) было превышены. Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize на соответствующий обязательный элемент.

Как вы можете видеть из раздела привязки в верхней части конфига, я пытался установить maxReceivedMessageSize равным 5000000, но служба все еще думает, что он установлен по умолчанию 65536. Любые идеи относительно того, что является неправильным или что «соответствующий» обязательный элемент?

Ответы [ 3 ]

28 голосов
/ 28 августа 2009

Там больше настроек :-) Попробуйте "maxBufferPoolSize" и "maxBufferSize" на теге <binding>.

Но самая большая проблема заключается в том, что ваша конечная точка не ссылается на эту конфигурацию привязки!

<endpoint address="" 
          binding="wsHttpBinding" contract="Core.TOAService.ITOAService">

Вам нужно добавить ссылку на нее, чтобы она стала полезной - просто назвать ее «по умолчанию» не работает .....

<endpoint address="" 
          binding="wsHttpBinding" 
          bindingConfiguration="default"
          contract="Core.TOAService.ITOAService">

Вы опередили свое время ;-) В WCF 4 (с .NET 4.0 - чуть позже в этом году 2009) вы сможете определять «конфигурации связывания по умолчанию», не называя их и не называя их явно но сейчас вам нужно создать связь между вашей конечной точкой и ее привязкой и любой конфигурацией привязки (или поведения), которая у вас есть!

Марк

16 голосов
/ 05 августа 2010

Если вы все еще получаете это сообщение об ошибке при использовании тестового клиента WCF, это потому, что у клиента есть отдельная настройка MaxBufferSize .

Чтобы исправить проблему:

  1. Щелкните правой кнопкой мыши узел Файл конфигурации в нижней части дерева
  2. Выберите Изменить с помощью SvcConfigEditor

Появится список редактируемых настроек, включая MaxBufferSize.

Примечание: Автоматически сгенерированные прокси-клиенты также устанавливают для MaxBufferSize значение 65536 по умолчанию.

1 голос
/ 28 августа 2009

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

  <basicHttpBinding>
    <binding name="httpBasicBinding_Service" closeTimeout="00:03:00"
      openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"
      maxBufferSize="2000001"
      maxBufferPoolSize="2000001" maxReceivedMessageSize="2000001">
      <readerQuotas maxDepth="2000001" maxStringContentLength="2000001"
        maxArrayLength="2000001" maxBytesPerRead="2000001" maxNameTableCharCount="2000001" />
    </binding>
  </basicHttpBinding>
...