El mensaje de respuesta de WCF toma 40 minutos y no se lanza ninguna excepción de tiempo de espera

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo un servicio WCF alojado en IIS7 (el servicio y la configuración del cliente se encuentran al final de esta publicación). Me he encontrado con un extraño escenario en el que esperaba que alguien pudiera tener algunas ideas sobre cómo atacarlo y encontrar una solución.

El servicio solo expone un contrato, 'ProcessMessage'. Puedo enviar / recibir mensajes síncronos del servicio utilizando ese contrato muy bien con el rendimiento esperado, pero una llamada particular a ese contrato devuelve más de 65KB de datos; alrededor de 1 MB. Al llamarlo originalmente, recibí el error máximo de tamaño de recepción máximo esperado. Así que aumenté el maxReceivedMessageSize, y ahora esta llamada en particular toma 40 minutos para volver al cliente. Esto va más allá de cualquiera de los ajustes de tiempo de espera, y más allá de lo que yo esperaría. El tiempo de procesamiento del lado del servidor es de solo 2 segundos. Parece estar retenido en el lado del cliente.

También he intentado subir varias de las otras cuotas en el archivo sin ningún resultado.

Cualquier pensamiento sería muy apreciado. Gracias.

Configuración de servicio:

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

Configuración del 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>

¿Fue útil?

Solución 2

He descubierto la causa básica del problema y una solución alternativa, sin embargo, una idea adicional sería excelente.

El DataSet se estaba serializando en formato XML por WCF. Forcé que el DataSet se serializara como un byte [] y el tiempo se redujo a 4 segundos. Una conjetura es que escapar de todos los caracteres en 4MB de XML para que la comunicación HTTP fuera válida es lo que causó el problema.

Otros consejos

Parece que no aumentaste el tamaño de los diversos parámetros en el lado del servidor, ¡definitivamente deberías intentarlo! Utilice también la configuración de enlace de su archivo de configuración de cliente en el lado del servidor; es posible que el servicio se esté atragantando ya que todavía tiene un tamaño de mensaje de 64K predeterminado.

Además, el receiveTimeout en la vinculación de su cliente es un poco extraño: falta un dígito cero:

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

Debes usar receiveTimeout="00:01:00"

Marc

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top