Come posso aumentare il timeout predefinito a più di 1 minuto su un servizio WCF?
Come posso aumentare il timeout predefinito a più di 1 minuto su un servizio WCF?
Risposte:
Ti riferisci al lato server o lato client?
Per un client, si desidera regolare l' attributo sendTimeout di un elemento di associazione. Per un servizio, si desidera modificare l' attributo receTimeout di un elemnent vincolante.
<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>
....
Naturalmente, è necessario mappare l'endpoint desiderato a quel particolare bind.
receiveTimeout
lato server regola la determinazione dell'ozio per i collegamenti basati sulla sessione. Ad esempio, il server non utilizzerà questa impostazione per i collegamenti basicHTTP. Devi eseguire il rollout del timeout di elaborazione sul lato server per WCF
Nel menu Strumenti di Visual Studio 2008 (o 2005 se hai installato il contenuto WCF corretto) è disponibile un'opzione chiamata "Editor di configurazione del servizio WCF".
Da lì è possibile modificare le opzioni di associazione sia per il client che per i servizi, una di queste opzioni sarà per i timeout.
Timeout diversi significano cose diverse. Quando lavori sul client .. probabilmente stai guardando principalmente a SendTimeout - controlla questo riferimento - spiegazione meravigliosa e pertinente: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread / 84551e45-19a2-4d0d-bcc0-516a4041943d /
Puoi scegliere due modi:
1) Per codice nel client
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) Da WebConfig in un server 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>
Per maggiori dettagli guarda la documentazione ufficiale
Oltre ai timeout di associazione (che sono in Timespan
s), potresti anche aver bisogno di questo. Questo è in pochi secondi.
<system.web>
<httpRuntime executionTimeout="600"/><!-- = 10 minutes -->