2010-10-27 3 views
9

У меня есть проблемы со следующей ошибкой: «Максимальный размер сообщения квоты для входящих сообщений (65536) был превышен, чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize на соответствующем скрепляющего элементаПочему моя служба WCF не загружает мою конфигурацию привязки?

Так Я сделал некоторые исследования и обнаружил, что мне нужно, чтобы увеличить буфер и размер сообщения, вот мой службы 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 Test и посмотреть на сгенерированный клиента файле конфигурации его не имеют мою привязку:

<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="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

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

+0

Мне кажется, что ваш клиент получает вашу привязку ... –

+0

Но у меня нет моих больших значений maxBufferPoolSize и maxReceivedMessageSize ... – MisterIsaak

ответ

11

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="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

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

+0

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

2

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

Смежные вопросы