Почему моя служба WCF не загружает мою конфигурацию привязки?

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

Итак, я провел небольшое исследование и обнаружил, что мне нужно увеличить размер буфера и сообщения, вот мой файл конфигурации службы WCF:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
          <binding name="default" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"/>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WCF.Service.Service">
        <endpoint address="ws" name="ws" bindingConfiguration="default" binding="wsHttpBinding" contract="WCF.Service.Contracts.IService" />
        <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" />
      </service>
    </services>
    <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>
  </system.serviceModel>

Когда я запускаю службу в тестовом клиенте WCF и смотрю на сгенерированный файл конфигурации клиента, он нет моей привязки:

<configuration>
<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="ws" closeTimeout="00:01:00" openTimeout="00:01:00"
                receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Message">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:37444/Service.svc/ws" binding="wsHttpBinding"
            bindingConfiguration="ws" contract="IService" name="ws">
            <identity>
                <userPrincipalName value="username@domain" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

I'm lost to as why my binding configuration is NOT getting applied!? The WCF Test Client is set to always regenerate the config as well. I've also tried updating the service reference in a consuming front end application, but it does not get the updated binding configuration either. Any suggestions would be greatly appreciated. Thanks!


person MisterIsaak    schedule 27.10.2010    source источник
comment
Мне кажется, что ваш клиент получает вашу привязку...   -  person Brian Driscoll    schedule 27.10.2010
comment
Но у него нет моих больших значений maxBufferPoolSize и maxReceivedMessageSize...   -  person MisterIsaak    schedule 27.10.2010


Ответы (2)


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

Итак, в вашем случае вам нужно добавить эту конфигурацию привязки к прокси-серверу на стороне клиента и ссылаться на нее с конечной точки клиента.

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

Итак, создайте файл bindings.config, содержащий:

<?xml version="1.0" ?>
<bindings>
    <wsHttpBinding>
        <binding name="default" 
                 maxBufferPoolSize="2147483647" 
                 maxReceivedMessageSize="2147483647"/>
  </wsHttpBinding>
</bindings>

а затем вы можете скопировать этот файл как на сервер, так и в клиентский проект, и ссылаться на него из вашей службы и конфигурации клиента:

<system.serviceModel>
    <bindings configSource="bindings.config" />
    <services>
      <service name="WCF.Service.Service">
        <endpoint address="ws" name="ws" bindingConfiguration="default" binding="wsHttpBinding" contract="WCF.Service.Contracts.IService" />
        <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" />
      </service>
    </services>

и на стороне вашего клиента:

<system.serviceModel>
    <bindings configSource="bindings.config" />
    <client>
        <endpoint  name="ws"
            address="http://localhost:37444/Service.svc/ws" 
            binding="wsHttpBinding"
            bindingConfiguration="default" 
            contract="IService">
            <identity>
                <userPrincipalName value="username@domain" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Таким образом, вы можете настроить привязки один раз и использовать их в обоих местах.

person marc_s    schedule 27.10.2010
comment
Вау, спасибо за отличное объяснение! Поэтому, поскольку клиентская сторона не использует конфигурации привязки с сервера, мне необходимо вручную настроить параметры для них отдельно. Я предполагаю, что при первом обращении к службе клиент должен увидеть тип привязки и установить требуемые значения по умолчанию. Еще раз спасибо! - person MisterIsaak; 27.10.2010

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

person Alex Lo    schedule 27.10.2010