Aumentar el valor de tiempo de espera en un servicio WCF

133

¿Cómo puedo aumentar el tiempo de espera predeterminado a más de 1 minuto en un servicio WCF?

Blankman
fuente
Lo que no está claro, pero creo que está preguntando implícitamente, es si es posible configurar en el lado del servidor para agotar el tiempo de espera de cualquier llamada que tarde más de un minuto en procesarse. Esto no es posible
gravidThoughts

Respuestas:

196

¿Te refieres al lado del servidor o al lado del cliente?

Para un cliente, desearía ajustar el atributo sendTimeout de un elemento de enlace. Para un servicio, desearía ajustar el atributo ReceiveTimeout de un elemento vinculante.

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>

  <services>
    <service name="longTimeoutService"
      behaviorConfiguration="longTimeoutBehavior">
      <endpoint address="net.tcp://localhost/longtimeout/"
        binding="netTcpBinding" bindingConfiguration="longTimeoutBinding" />
    </service>
....

Por supuesto, debe asignar su punto final deseado a ese enlace particular.

icelava
fuente
¿Cómo mapeo el enlace, usando el 'nombre de enlace' dentro de la etiqueta de punto final?
Blankman
Esto es simplemente incorrecto. En receiveTimeoutel lado del servidor, se determina la inactividad de los enlaces basados ​​en sesión. Por ejemplo, el servidor no usará esta configuración para enlaces básicos HTTP.
Debe
45

Debajo del menú Herramientas en Visual Studio 2008 (o 2005 si tiene instalado el material WCF correcto) hay una opción llamada 'Editor de configuración de servicio WCF'.

Desde allí, puede cambiar las opciones de enlace tanto para el cliente como para los servicios, una de estas opciones será para los tiempos de espera.

Kieron
fuente
La herramienta es una excelente manera de evitar errores como envolver los elementos de manera incorrecta, ortografía, etc. ¡Buena decisión!
markaaronky
vea también aquí la otra herramienta para abrir los archivos de registro: stackoverflow.com/a/34283667/187650
juFo
8

Puedes elegir dos formas:

1) Por código en el cliente

public static void Main()
{
    Uri baseAddress = new Uri("http://localhost/MyServer/MyService");

    try
    {
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService));

        WSHttpBinding binding = new WSHttpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

        serviceHost.AddServiceEndpoint("ICalculator", binding, baseAddress);
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

    }
    catch (CommunicationException ex)
    {
        // Handle exception ...
    }
}

2) Por WebConfig en un servidor web

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Para más detalles ver las documentaciones oficiales

Configuración de valores de tiempo de espera en un enlace

Clase WSHttpBinding

daniele3004
fuente
0

Además de los tiempos de espera vinculantes (que están en Timespans), es posible que también necesite esto. Esto es en segundos.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Derreck Dean
fuente