Страшный запрос WCF BAD 400 из-за того, что maxReceivedMessageSize все еще равен 65536

Боже, ты просто не любишь WCF.

Я прочитал все возможные темы, но я действительно застрял сейчас.

Вот конфигурация WCF:

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
         <binding name="BaseHttp" 
                  maxBufferSize="4194304" 
                  maxBufferPoolSize="4194304" 
                  maxReceivedMessageSize="4194304"  />
      </basicHttpBinding>
   </bindings>
   <behaviors>
      <serviceBehaviors>
         <behavior name="TaskServiceBehavior">
            <serviceMetadata httpGetEnabled="True" />
            <serviceDebug includeExceptionDetailInFaults="True" />
         </behavior>
         <behavior name="">
            <serviceMetadata httpGetEnabled="true" />
         </behavior>
      </serviceBehaviors>
   </behaviors>
   <services>
      <service behaviorConfiguration="TaskServiceBehavior" name="TaskService">
         <endpoint 
             address="http://www.mysite.com/TableTaskService/TableTaskService.svc" 
             binding="basicHttpBinding" bindingConfiguration="BaseHttp" 
             contract="TableTaskService.ITableTaskService" />
         <endpoint 
             address="mex" 
             binding="mexHttpBinding"  
             contract="IMetadataExchange" />
         <host>
            <baseAddresses>
               <add baseAddress="http://www.mysite.com/TableTaskService/" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
         <add prefix="http://www.mysite.com/" />
      </baseAddressPrefixFilters>
   </serviceHostingEnvironment>
</system.serviceModel>

Теперь я отправляю сообщение и получаю это исключение по умолчанию (увидел в файле svclog):

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

Теперь я четко заявляю, что она должна быть 4мб.

Мой клиентский код:

TableTaskServiceClient client = 
    new TableTaskServiceClient(
          new BasicHttpBinding { MaxBufferSize = 4194304, 
                                 MaxReceivedMessageSize = 4194304 }, 
          new EndpointAddress(GetEndpointAddressString())
    );

Тем не менее, он выдает мне эту ошибку размера 65536. Откуда это??..

Также ДЕЙСТВИТЕЛЬНО ли важно, что клиент устанавливает MaxReceivedMessageSize на то же значение, что и сервер? Думаю, было бы логично, чтобы за определение длины отвечал сервер, а не клиент.

Также есть это предупреждение (обратите внимание, насколько оно полезно в том, что оно говорит, а именно: нет информации об элементе, который переопределяется, или я что-то упустил), может быть, именно basichttpbinding переопределяется? но с чего бы это? в любом случае:

[TraceRecord] Предупреждение о серьезности TraceIdentifier http://msdn.microsoft.com/en-US/library/System.ServiceModel.OverridingDuplicateConfigurationKey.aspx Описание Система конфигурации обнаружила повторяющийся ключ в другой области конфигурации и переопределяет более новое значение. AppDomain /LM/W3SVC/11/ROOT/TableTaskService-33-1296567 Источник System.ServiceModel.Configuration.ServiceBehaviorElementCollection/-851144413 поведение ElementName OldElementLineNumber 0 NewElementLineNumber 0

ОБНОВЛЕНИЕ: перенастроены как служба, так и клиент:

TableTaskServiceClient client = new TableTaskServiceClient(
                        new BasicHttpBinding { 
                            MaxBufferSize = 4194304, 
                            MaxReceivedMessageSize = 4194304,
                            MaxBufferPoolSize=4194304,
                            ReaderQuotas = new XmlDictionaryReaderQuotas
                                               {
                                                   MaxArrayLength = 4194304, 
                                                   MaxBytesPerRead = 4194304, 
                                                   MaxDepth = 4194304, 
                                                   MaxNameTableCharCount = 4194304,
                                                   MaxStringContentLength = 4194304
                                               }
                        }, new EndpointAddress(GetEndpointAddressString()));

Все та же ошибка.

Если это представляет интерес, я отправляю массив byte[] длиной 467000~


person Valentin Kuzub    schedule 13.11.2011    source источник


Ответы (1)


Попробуй это:

<basicHttpBinding>
  <binding name="BaseHttp"
           maxBufferSize="4194304"
           maxBufferPoolSize="4194304"
           maxReceivedMessageSize="4194304">
    <readerQuotas maxArrayLength="4194304"
                  maxBytesPerRead="4194304"
                  maxDepth="4194304"
                  maxNameTableCharCount="4194304"
                  maxStringContentLength="4194304"
                  />
  </binding>
</basicHttpBinding>

Хотя некоторые из этих настроек не имеют смысла, я просто установил для них большое значение.

Кроме того, как только вы заработаете, я настоятельно рекомендую вам сократить значения, поскольку они присутствуют для предотвращения DoS-атаки на ваш сайт.

person Merlyn Morgan-Graham    schedule 13.11.2011
comment
Та же ошибка. Я пару раз подтверждал, что эта конфигурация используется в конфигурации службы (изменена на BaseHttp1, увидела ошибку, вернулась, служба отлично работает в браузере), но все та же. Я считаю, что это должно работать .. но это просто не так. - person Valentin Kuzub; 13.11.2011
comment
Вы настраиваете и сервис, и клиент? Потому что я готов поспорить, что на стороне клиента тоже есть настройка ограничения. - person Merlyn Morgan-Graham; 13.11.2011