¿Cómo puedo aumentar el tiempo de espera predeterminado a más de 1 minuto en un servicio WCF?
¿Cómo puedo aumentar el tiempo de espera predeterminado a más de 1 minuto en un servicio WCF?
Respuestas:
¿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.
receiveTimeout
el 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.
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.
Diferentes tiempos de espera significan cosas diferentes. Cuando está trabajando en el cliente ... probablemente esté viendo principalmente SendTimeout - verifique esta referencia - explicación maravillosa y relevante: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread / 84551e45-19a2-4d0d-bcc0-516a4041943d /
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
Además de los tiempos de espera vinculantes (que están en Timespan
s), es posible que también necesite esto. Esto es en segundos.
<system.web>
<httpRuntime executionTimeout="600"/><!-- = 10 minutes -->