Ответное сообщение WCF занимает 40 минут, исключение не истекло - PullRequest
1 голос
/ 30 июля 2009

У меня есть служба WCF, размещенная в IIS7 (конфигурация службы и клиента находится в конце этого поста). Я столкнулся со странным сценарием, в котором я надеялся, что у кого-то могут быть какие-то идеи о том, как атаковать его и найти решение.

Сервис предоставляет только один контракт «ProcessMessage». Я могу отправлять / получать синхронные сообщения от службы, используя этот контракт, что вполне соответствует ожидаемой производительности, но один конкретный вызов этого контракта возвращает более 65 КБ данных; около 1 МБ. Первоначально вызвав его, я получил ожидаемую ошибку превышения максимального размера приема. Поэтому я увеличил maxReceivedMessageSize, и теперь этот конкретный вызов занимает 40 минут, чтобы вернуться к клиенту. Это намного превышает любые настройки тайм-аута и намного превышает то, что я ожидал бы. Время обработки на стороне сервера составляет всего 2 секунды. Кажется, он задерживается на стороне клиента.

Я также пытался увеличить несколько других квот в файле, но безрезультатно.

Любые мысли будут с благодарностью. Спасибо.

Сервисная конфигурация:

  <system.serviceModel>
<services>
  <service behaviorConfiguration="Lrs.Esf.Facade.Startup.FacadeBehavior"
    name="Lrs.Esf.Facade.Startup.FacadeService">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="default" contract="Lrs.Esf.Facade.Startup.IFacadeService">
      <identity>
        <servicePrincipalName value="lrsdomain/PensionDev" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="default">
      <security mode="None"/>
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="Lrs.Esf.Facade.Startup.FacadeBehavior">
      <!-- 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>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IFacadeService" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:1:00" sendTimeout="00:01:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
          maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None">          
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://esf2.facade.testpe.pg.local/FacadeWcf/FacadeService.svc"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFacadeService"
      contract="FacadeServiceReference.IFacadeService" name="WSHttpBinding_IFacadeService">
    <identity>
      <servicePrincipalName value="lrsdomain/PensionDev" />
    </identity>
  </endpoint>
</client>

Ответы [ 2 ]

1 голос
/ 30 июля 2009

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

Кроме того, receiveTimeout в привязке вашего клиента немного забавно - в нем отсутствует нулевая цифра:

<binding name="WSHttpBinding_IFacadeService" 
receiveTimeout="00:1:00" 

Вы должны использовать receiveTimeout="00:01:00"

Марк

0 голосов
/ 31 июля 2009

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

Набор данных был сериализован в формате XML WCF. Я заставил DataSet сериализоваться как байт [], и время сократилось до 4 секунд. Можно предположить, что проблема была вызвана экранированием всех символов в 4 МБ XML, чтобы HTTP-связь была действительной.

...