2009-10-05 21 views
77

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 de svc?WCF Service, ¿cómo aumentar el tiempo de espera?

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 entonces mi punto final se asigna la siguiente manera:

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

El error exacto que estoy recibiendo:

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

En el cliente de prueba WCF, hay un icono de configuración que contiene la configuración de tiempo de ejecución de mi servicio:

Como se puede ver, no es el mismo valor que he establecido para ello? ¿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> 

Respuesta

23

El tiempo de espera se debe establecer a nivel de cliente, por lo que la configuración yo estaba sentado en el web.config no tuvo ningún efecto, la herramienta de prueba WCF tiene su propia configuración y allí es donde se necesita para establecer el tiempo de espera

+1

bueno, sí, por lo general, tiene que establecerse tanto en el cliente como en el servidor, incluso - p. en caso de "inactivityTimeout" en sesiones y cosas por el estilo. –

+7

JL: ¿puedes mostrar lo que has hecho? Estoy teniendo el mismo problema –

+0

Si utiliza el 'WCF Test Client', haga clic derecho en 'Config File' en el árbol de servicios, luego haga clic en 'Editar con SvcConfigEditor' y cambie el tiempo de espera dentro de los enlaces. – Radderz

154

En su configuración de enlace, hay cuatro valores de tiempo de espera se puede ajustar:

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

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

Como su nombre indica es openTimeout la cantidad de tiempo que está dispuesto a esperar cuando abre la conexión a su servicio WCF. Del mismo modo, el closeTimeout es la cantidad de tiempo al cerrar la conexión (disponer del proxy del cliente) que esperará antes de que se produzca una excepción.

El receiveTimeout es 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 receiveTimeout es la cantidad de tiempo que va a dar a usted cliente recibir y procesar la respuesta del servidor.

En caso de que envíe y reciba mensajes "normales", ambos pueden ser muy cortos, especialmente el receiveTimeout, ya que recibir un mensaje SOAP, descifrarlo, revisarlo y deserializarlo no debería demorar. La historia es diferente con la transmisión, en ese caso, es posible que necesite más tiempo en el cliente para completar la "descarga" de la transmisión que recibe del servidor.

También hay openTimeout, receiveTimeout y closeTimeout. El MSDN docs on binding le brinda más información sobre para qué sirven.

de obtener un control serio en todos los intricasies de WCF, recomendaría encarecidamente que compre el libro "Learning WCF" por Michele Leroux Bustamante:

Learning 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 pasar un rato observándola 15 -parte "WCF Top to Bottom" screencast series - ¡muy recomendable!

Para temas más avanzados, le recomiendo que consulte el libro de servicios de Juwal Lowy Programming WCF.

configuración

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

+0

he intentado añadir las secciones de unión a en web.config, pero su lanzando un error ahora .... cualquier paso adicional I me he perdido ... –

+0

También cambié el punto final en mi servicio a la

+0

Creo que lo entiendo - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout" –

4

Hace un momento recibí el mismo error pero pude solucionarlo asegurándome de cerrar cada llamada al cliente wcf. por ej.

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

o

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    //More codes here 
} 
+9

No use el enfoque 'usar': http: // omaralzabir.com/do-not-use-using-in-wcf-client/ –

+0

En los comentarios de http://omaralzabir.com/do-not-use-using-in-wcf-client, hay ejemplos de cómo aún use 'using' mientras no descarta un objeto de canal con falla. Aquí hay otro blogger con un enfoque más compatible con los bloques 'using': http://erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper/. – Greg

13

La mejor manera es cambiar cualquier ajuste que desee en el código.

Salida el siguiente ejemplo:

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30); 
} 
+0

gran consejo, gracias – ukie

Cuestiones relacionadas