2009-11-10 7 views
0

J'ai un morceau de code qui appelle un service WCF qui est hébergé sur un serveur.WCF: erreur de délai d'attente

Le code continue de tourner autour et d'appeler cette méthode encore et encore. (Cela demande un 'statut', donc ça ne fonctionne pas du tout).

C'est bien, sauf que, après une courte période de temps je reçois une erreur:
Cette opération de requête envoyée à Net.TCP: // nomserveur: 9001/service1 n'a pas reçu de réponse dans le délai configuré (00:00 : 09.9843754)

Et soudainement je ne peux pas obtenir au serveur du tout JAMAIS. J'ai augmenté le timeout à 1min mais toujours le même problème. Notez que le programme qui héberge le service ne fait rien d'autre, offrant simplement son 'statut'. Ce n'est donc pas un problème avec l'application de service WCF occupée.

Je pense que c'est un problème avec le code appelant le service parce que quand je redémarre l'application, il peut très bien se connecter au service ... jusqu'à ce que je reçoive une fois de plus l'erreur timeout. Pour cette raison, je ne pense pas que ce soit une erreur de réseau non plus, car quand je redémarre l'application c'est ok pour une période de temps.

Voici le code que j'utilise pour appeler le service. Ai-je besoin de me débarrasser de ChannelFactory après chaque appel pour le nettoyer ou qu'est-ce que je fais?

 NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message); 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

       EndpointAddress endPoint = new EndpointAddress(new Uri(clientPath)); 

       ChannelFactory<IClient> channel = new ChannelFactory<IClient>(binding, endPoint); 
       channel.Faulted += new EventHandler(channel_Faulted); 
       IClient client = channel.CreateChannel(); 

       ((IContextChannel)client).OperationTimeout = new TimeSpan(0, 0, 10); 
       ClientStatus clientStatus = client.GetStatus(); 

Répondre

0

Vous devez fermer les connexions client après avoir terminé l'appel de GetStatus. La meilleure façon de le faire est d'utiliser un bloc utilisant. Mais vous pouvez aussi faire quelque chose comme ça Cela ne fonctionnera pas après votre client.GetStatus d'appel()

ClientStatus clientStatus = client.GetStatus(); 

try 
{ 
    if (client.State != System.ServiceModel.CommunicationState.Faulted) 
    { 
     client.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    client.Abort(); 
} 
+0

parce que si l'Etat est en défaut, neighter Close() ni A propos de() sera appelée. vous devez soit déplacer le client.GetState() dans le bloc try, soit supprimer la codition avant d'appeler Close(). –

Questions connexes