Servicio WCF, ¿cómo aumentar el tiempo de espera?

93

Puede parecer una pregunta tonta, pero todo en WCF parece mucho más complicado que en asmx, ¿cómo puedo aumentar el tiempo de espera de un servicio svc?

Esto es lo que tengo hasta ahora:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

Y luego mi punto final se mapea así:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

El error exacto que obtengo:

El canal de solicitud agotó el tiempo de espera mientras esperaba una respuesta después de las 00: 00: 59.9990000. Aumente el valor de tiempo de espera pasado a la llamada a Solicitar o aumente el valor de SendTimeout en el enlace. El tiempo asignado a esta operación puede haber sido una parte de un tiempo de espera más largo.

En WCF Test Client, hay un ícono de configuración que contiene la configuración de tiempo de ejecución de mi servicio:

Como puede ver, ¿no son los mismos valores que le he fijado? ¿Qué estoy haciendo mal?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
JL.
fuente

Respuestas:

179

En su configuración de enlace, hay cuatro valores de tiempo de espera que puede modificar:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

El más importante es el sendTimeout, que dice cuánto tiempo esperará el cliente una respuesta de su servicio WCF. Puede especificar hours:minutes:secondsen su configuración: en mi muestra, establezco el tiempo de espera en 25 minutos.

El openTimeoutcomo su nombre indica es la cantidad de tiempo que estás dispuesto a esperar cuando se abre la conexión con el servicio WCF. Del mismo modo, closeTimeoutes la cantidad de tiempo que esperará antes de que se lance una excepción cuando cierre la conexión (elimine el proxy del cliente).

El receiveTimeoutes un poco como un espejo para el sendTimeout- mientras que el tiempo de espera de envío es la cantidad de tiempo que va a esperar por una respuesta del servidor, el receiveTimeoutes la cantidad de tiempo que te dará cliente para recibir y procesar la respuesta de la servidor.

En caso de que envíe mensajes "normales" de ida y vuelta, ambos pueden ser bastante cortos, especialmente el receiveTimeout, ya que recibir un mensaje SOAP, descifrarlo, verificarlo y deserializarlo no debería llevar casi ningún tiempo. La historia es diferente con la transmisión: en ese caso, es posible que necesite más tiempo en el cliente para completar realmente la "descarga" de la transmisión que recibe del servidor.

También hay openTimeout, receiveTimeout y closeTimeout. Los documentos de MSDN sobre el enlace le brindan más información sobre para qué sirven.

Para tener un control serio sobre todas las intrigas de WCF, le recomiendo que compre el libro " Learning WCF " de Michele Leroux Bustamante:

Aprendizaje WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

y también pasa algún tiempo viendo su serie de screencasts de 15 partes " WCF de arriba a abajo " - ¡muy recomendable!

Para temas más avanzados, le recomiendo que consulte el libro de Servicios WCF de programación de Juwal Lowy .

Programación WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

marc_s
fuente
Intenté agregar las secciones de enlace a <system.serviceModel> en web.config, pero ahora arroja un error ... cualquier paso adicional que me haya perdido ...
JL.
También cambié el punto final en mi servicio a <endpoint address = "" binding = "IncreasedTimeout" - ¿Es esto lo incorrecto?
JL.
Creo que lo entiendo - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout"
JL.
exactamente: el enlace es el tipo de protocolo que usa: basicHttp, wsHttp, netTcp. La unión de configuración se esta configuración se crea en config para modificar los tiempos de espera, etc.
marc_s
Es curioso, incluso después de hacer esto, todavía aparece un error de tiempo de espera, Marc, ¿puedes dar la mayor cantidad de información posible?
JL.
27

La mejor manera es cambiar cualquier configuración que desee en su código.

Mira el siguiente ejemplo:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
usuario3891644
fuente
esta es una mejor solución en lugar de actualizar la configuración para poder configurar un valor diferente para diferentes llamadas y servicios, muchas gracias
Salim
26

La configuración del tiempo de espera debe establecerse en el nivel del cliente, por lo que la configuración que estaba configurando en web.config no tuvo ningún efecto, la herramienta de prueba WCF tiene su propia configuración y es allí donde debe establecer el tiempo de espera.

JL.
fuente
1
bueno, sí, por lo general, debe configurarse tanto en el cliente como en el servidor, incluso, por ejemplo, en caso de "inactivityTimeout" en sesiones y cosas así.
marc_s
8
JL: ¿Puedes mostrar lo que has hecho exactamente? estoy teniendo el mismo problema
Nick Kahn
Si usa el 'Cliente de prueba WCF', haga clic derecho en 'Archivo de configuración' en el árbol de servicios, luego haga clic en 'Editar con SvcConfigEditor' y cambie el tiempo de espera dentro de los enlaces.
Radderz
4

Recibí el mismo error recientemente, pero pude solucionarlo asegurándome de cerrar cada llamada de cliente de wcf. p.ej.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

o

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}
arjaye
fuente
10
No use el enfoque de 'usar': omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall
En los comentarios de omaralzabir.com/do-not-use-using-in-wcf-client , hay ejemplos de cómo seguir usando usingsin eliminar un objeto de canal defectuoso. Aquí hay otro blogger con un enfoque más compatible con usingbloques: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Greg