2010-05-19 7 views
2

J'ai un problème avec un service WCF que je viens de créer. Cela a fonctionné hier, mais pour une raison quelconque, il a juste cessé de fonctionner.CommunicationException dans WCF

Un de mes méthodes WCF retourne un tableau d'une entité Entity Framework, comme ceci:

public BranchContactDetail[] GetClosestBranches(string postcode, int howManyBranches) 
    { 
     GeoLocation geoLocation = GetLocationFromPostcode(postcode); 
     Location location = new Location(geoLocation.Latitude, geoLocation.Longitude); 

     using (BranchDirectoryEntities entities = new BranchDirectoryEntities()) 
     { 
      var branchesInOrder = entities.BranchContactDetails 
       .Where(b => b.latitude.HasValue && b.longitude.HasValue) 
       .OrderBy(b => location.DistanceFrom(b.latitude, b.longitude)) 
       .Take(howManyBranches) 
       .ToArray(); 

      return branchesInOrder; 
     } 
    } 

... et, comme je le dis, ce fonctionnait bien hier. Maintenant, je reçois un "La connexion sous-jacente a été fermée: La connexion a été fermée de façon inattendue." J'ai chassé partout sur le web, mais personne ne semble connaître la réponse. Quelqu'un a-t-il fait la lumière sur cette question?

Cordialement, Mark

Répondre

0

Très probablement, vous avez un problème de connexion. Je veux dire que vous n'avez pas accès à la ressource à laquelle vous essayez d'accéder. Y a-t-il un pare-feu ou autre chose? Pour être sûr essayer de telnet le serveur de l'ordinateur client.

+0

Non, je ne retourne pas plus de résultats. En fait, dans les tests, je reviens moins - seulement 5 entités.Une chose différente est que l'entité Branch a beaucoup plus de dépendances - des clés étrangères et ainsi de suite. La WCF pourrait-elle avoir des problèmes avec ceux-ci? – serlingpa

+0

Je n'ai pas dit qu'il peut être connecté à la taille du résultat. Cela peut être un problème de connectivité. S'il vous plaît lire ci-dessus. – Incognito

+0

J'ai ajouté les éléments de diagnostic comme vous le suggérez à marc_s, et j'ai lu les journaux en cours de production, mais je ne suis pas le plus sage. Je peux voir où l'exception est réellement lancée, mais je ne vois pas pourquoi! Aargh !! – serlingpa

1

Se pourrait-il que vous sélectionniez beaucoup plus d'entrées aujourd'hui par rapport à hier? Se pourrait-il que votre méthode de service prenne plus de temps que la valeur par défaut de 60 secondes pour retourner les données? Ou pourrait-il être que la taille des données va au-delà de 64K pour les entités retournées?

Je ferais deux choses:

1) Allumez les détails de l'exception, de sorte que vous pouvez obtenir un message d'exception détaillée sur le client - qui devrait pointer, espérons-vous dans la bonne direction

2) activer la journalisation des messages WCF pour voir ce qui se passe à travers le fil

pour le point 1, vous devez activer le comportement serviceDebug:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="debug"> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="debug" name="YourWCFService"> 

Cela devrait vous donner des détails dans le client, lorsqu'un appel échoue.

Pour le point no. 2, vous devez faire quelques pas:

intérieur <system.serviceModel>, vous devez ajouter cette balise de diagnostic:

<diagnostics> 
    <messageLogging 
     logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" 
     logEntireMessage="true" logMalformedMessages="true" 
     maxMessagesToLog="2500" maxSizeOfMessageToLog="256000" /> 
</diagnostics> 

et vous devez également ajouter à votre app.config ou web.config:

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
        switchValue="Information, ActivityTracing" 
        propagateActivity="true"> 
     <listeners> 
      <add name="default" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="C:\yourlogfile.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    <trace autoflush="true" /> 
    </system.diagnostics> 

Il y a deux types d'écoute de trace prédéfinis dans l'espace de noms System.Diagnostics - utiliser l'un de ces ceux prêts à l'emploi, ou créer votre propre (par exemple, pour se connecter à une base de données ou telle).

Découvrez ces sources d'information supplémentaires sur la façon d'activer le traçage dans WCF:

Vous pouvez consulter ces fichiers svclog XML en utilisant la WCF Trace Viewer Tool - très pratique !

Questions connexes