A mensagem de resposta do WCF leva 40 minutos e nenhuma exceção de tempo limite é lançada

StackOverflow https://stackoverflow.com/questions/1207770

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho um serviço WCF hospedado no IIS7 (a configuração de serviço e cliente está no final desta postagem). Eu encontrei um cenário estranho que esperava que alguém tivesse algumas idéias sobre como atacá -lo e encontrar uma solução.

O serviço expõe apenas um contrato, 'ProcessMessage'. Posso enviar/receber mensagens síncronas do serviço usando esse contrato bem com o desempenho esperado, mas uma chamada específica para esse contrato retorna mais de 65kb de dados; cerca de 1 mb. Ao chamá -lo originalmente, recebi o tamanho esperado do tamanho máximo de recebimento excedido. Por isso, aumentei o MaxReceivedMessagesize e agora essa chamada em particular leva 40 minutos para retornar ao cliente. Isso está muito além de qualquer uma das configurações de tempo limite e muito além do que eu esperaria que fosse levar. O tempo de processamento do lado do servidor é de apenas 2 segundos. Parece ser mantido no lado do cliente.

Também tentei esbarrar em várias outras cotas no arquivo sem sucesso.

Qualquer pensamento seria muito apreciado. Obrigado.

Config de serviço:

  <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>

Config do cliente:

  <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>

Foi útil?

Solução 2

Eu descobri a causa básica do problema e uma subida, porém insights adicionais seriam ótimos.

O conjunto de dados estava sendo serializado em formato XML pelo WCF. Forcei o conjunto de dados a serializar como um byte [] e o tempo reduzido para 4 segundos. Um palpite é que escapar de todos os caracteres em 4 MB de XML para que a comunicação HTTP fosse válida é o que causou o problema.

Outras dicas

Você não aumentou o tamanho dos vários parâmetros do lado do servidor, ao que parece - você definitivamente deve tentar isso! Use a configuração de ligação do arquivo de configuração do seu cliente no lado do servidor - o serviço pode estar sufocando, pois ainda está inadimplente para o tamanho da mensagem de 64 mil.

Também o receiveTimeout Na ligação do seu cliente, é um pouco engraçado - está faltando um dígito zero:

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

Você deveria usar receiveTimeout="00:01:00"

Marc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top