Исключение связи службы WCF из-за размера параметра - PullRequest
4 голосов
/ 06 августа 2010

У меня есть веб-метод WCF, который принимает в качестве параметра объект XElement.Для одного из моих файлов XML (размером около 600 КБ или около того) это прекрасно работает, однако для этого более крупного файла XML (около 5 МБ) я сразу получаю сообщение CommunicationException.

Я уже увеличил размеры сообщенийдля моего связывания.Ниже раздел ServiceModel моего web.config:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior name="BIMIntegrationWS.metadataBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>        

<bindings>
  <customBinding>        
    <binding name="BIMIntegrationWS.IntegrationService.customBinding0"
      closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:10:00">
      <binaryMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      </binaryMessageEncoding>
      <httpTransport  maxBufferPoolSize="2147483647"   maxBufferSize="2147483647"
                      maxReceivedMessageSize="2147483647" />
    </binding>
  </customBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>      
  <service name="BIMIntegrationWS.BIMIntegrationWS" behaviorConfiguration="BIMIntegrationWS.metadataBehavior">
    <endpoint address="" binding="customBinding" bindingConfiguration="BIMIntegrationWS.IntegrationService.customBinding0"
     contract="BIMIntegrationWS.IBIMIntegrationService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
</system.serviceModel>

На клиенте мой ClientConfig выглядит так:

<system.serviceModel>      
      <bindings>
            <customBinding>                
                  <binding name="CustomBinding_IBIMIntegrationService">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />                                       
                  </binding>
            </customBinding>
      </bindings>        
    <client>          
        <endpoint address="http://localhost:1895/IntegrationService.svc"
            binding="customBinding" bindingConfiguration="CustomBinding_IBIMIntegrationService"
            contract="BIMIntegrationService.IBIMIntegrationService" name="customBindingEndpoint" />
    </client>
</system.serviceModel>

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 15 августа 2010

попробуйте добавить следующий фрагмент в ваш web.config для приложения-службы:

  <system.web>
    <httpRuntime maxRequestLength="16384" /> <!-- 16MB -->
  </system.web>

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

С уважением, Ладислав

1 голос
/ 13 августа 2010

Может быть, ваш XElement имеет слишком много узлов / дочерних элементов, и вам нужно установить атрибут maxItemsInObjectGraph в dataContractSerializer на что-то большее?

1 голос
/ 06 августа 2010

Возможно, вам потребуется изменить значения атрибутов субэлемента <readerQuotas /> для <binaryMessageEncoding />.

Для получения дополнительной информации см .: http://msdn.microsoft.com/en-us/library/ms731325.aspx http://forums.silverlight.net/forums/p/88704/205040.aspx

Обновление: Можете ли вы попытаться увеличить maxAllowedContentLength, как описано здесь: http://social.msdn.microsoft.com/Forums/en/wcf/thread/e6e21132-ad3f-4135-8ab9-77923b099907

0 голосов
/ 14 августа 2010

Знаете ли вы, как отключить хост VS и просто развернуть его в IIS и дать ему пинг.Обычный IIS 7 на вашем устройстве dev будет работать нормально.Вы все еще можете прикрепить отладчик и т. Д., Но у вас не будет мгновенного удовлетворения F5, но, поскольку ваш код не умирает при запуске, вам все равно не нужно видеть, с первой ли строки :-)

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

...