Почему моя служба WCF не загружает конфигурацию Binding? - PullRequest
9 голосов
/ 27 октября 2010

У меня проблема со следующей ошибкой: « Превышена квота максимального размера сообщения для входящих сообщений (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>

Я заблудился, потому что моя конфигурация связывания НЕ применяется !? Тестовый клиент WCF также настроен на повторную генерацию конфигурации. Я также пытался обновить ссылку на службу в потребляющем внешнем приложении, но не также получает обновленную конфигурацию привязки. Любые предложения будут ценны. Спасибо!

Ответы [ 2 ]

11 голосов
/ 27 октября 2010

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>

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

2 голосов
/ 27 октября 2010

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

...