2009-10-09 6 views
1

Ceci est ma première tentative d'utiliser WCF donc il peut y avoir quelque chose de fondamentalement mauvais dans cette approche - si oui, je suis heureux de passer à un autre modèle. En un coup d'œil, je pensais que la réponse à this question aurait fonctionné, mais mon scénario semble être différent.Pourquoi un service Web WCF hébergé dans IIS cesserait-il de répondre de manière aléatoire?

J'ai un site Web ASP.NET MVC où les contrôleurs accèdent à la classe client WCF par un dépôt intermédiaire. Le référentiel est simplement un wrapper autour du client WCF qui l'instancie une fois et définit l'adresse de point de terminaison appropriée. Je peux accéder à des pages différentes sur le site Web jusqu'à un point apparemment aléatoire où le service WCF commencera à expirer. Peu importe quelle méthode j'appelle non plus - c'est le délai d'attente sur les différents. Je ne vois aucune exception sur la machine IIS hébergeant le service WCF non plus; le journal des événements est vide. Une méthode simple comme GetCustomerByName() qui a fonctionné deux minutes plus tôt ne sera plus, donc je pense que c'est plus à faire avec la communication WCF plutôt que le service lui-même.

Si je tente d'utiliser le client de test WCF après un de ces délais d'attente se produit, elle aussi échouer. Mais, si j'attends un peu (et que je choisis "commencer un nouveau proxy"), les choses vont fonctionner à nouveau.

Je suis très confus - dois-je créer une nouvelle instance du client WCF chaque fois que je veux l'utiliser dans mon dépôt? Y a-t-il une autre façon d'utiliser le client? Envelopper chaque appel dans Open()/Close() ne fonctionne pas non plus puisque le premier appel à Close() place l'objet dans un état éliminé.

+0

Je doute qu'il est WCF - plus probablement, il est IIS et les pools d'applications ASP.NET qui bloquent votre communication. L'hébergement d'IIS pour WCF est une solution ..... sous-optimale - j'hébergerais toujours des services de WCF dans mes propres services de NT ou applications de console. –

+0

Je suis un peu confus. Votre application MVC utilise-t-elle un service WCF hébergé dans une autre instance IIS? –

+0

marc_s Avez-vous plus d'informations sur pourquoi l'hébergement de WCF dans IIS est sous-optimal? Nous devons déployer ce service sur le site du client et le moyen le plus simple de les faire accepter semble être l'hébergement dans IIS. – Jedidja

Répondre

2

Une fois que vous avez terminé avec votre client WCF, vous devez le fermer explicitement, sinon il maintiendra une 'connexion' ouverte au service, et il y a une limite (configurable) au nombre de connexions simultanées possibles.

Bien qu'il soit possible de modifier cette limite, la bonne solution est de créer un nouveau client WCF, invoquer une ou plusieurs méthodes sur et la fermer à nouveau lorsque vous avez terminé. Ceci est considéré comme la meilleure pratique, et devrait éviter soigneusement le genre de problèmes que vous rencontrez actuellement.

Cela signifie que votre mise en œuvre devrait plutôt aller quelque chose comme ceci:

public class WcfRepository : IRepository 
{ 
    public bool MyMethod1() 
    { 
     var client = new MyWCFServiceClient(); 
     try 
     { 
      return client.MyMethod1(); 
     } 
     finally 
     { 
      try 
      { 
       client.Close(); 
      } 
      catch(CommunicationException) 
      { 
       // handle exception here 
      } 
      catch(TimeoutException) 
      { 
       // handle exception here 
      } 

     } 
    } 

    ... etc  
} 

Notez l'essai méchant/construire enfin, ce qui est nécessaire parce que peut jeter Fermer. En savoir plus sur ce here.

+0

Mark - pouvez-vous recommander un bon matériel de lecture sur le sujet?En outre, y a-t-il des meilleures pratiques quand il s'agit d'envelopper cet essai/enfin/essayer d'une manière générique? On dirait beaucoup de code standard qui pourrait être simplifié. – Jedidja

+0

Ce lien peut être utile: http://www.slideshare.net/blowdart/10-tricks-and-tips-for-wcf. La diapositive 15 montre une méthode similaire d'élimination. – Jedidja

+0

La dernière fois que j'ai dû gérer cela, j'ai écrit une méthode réutilisable qui faisait tout ce code et prenait un Func comme paramètre d'entrée pour que je puisse simplement passer le Func à la méthode et gérer le client en toute sécurité. –

Questions connexes