2010-01-25 4 views
1

J'utilise le client WCF comme ça ...Comment ouvrir correctement le service WCF

var client = new TestClient(); 
try 
{  
    response = service.Operation(request); 
} 
finally 
{  
    try 
    { 
     if (client.State != CommunicationState.Faulted) 
      client.Close(); 
    } 
    catch (Exception) 
    { 
     client.Abort(); 
    } 
} 

mais de temps en temps je reçois 500 erreur HTTP qui est la seule réponse que je reçois pendant 15 prochaines minutes, puis tout est de retour à la normale pendant 15 minutes et ainsi de suite. Je sais qu'il y a des tâches d'équilibrage de la charge de travail, mais les gars n'y trouvent aucun problème.

C'est pourquoi j'ai commencé à me demander si j'utilise correctement le service WCF. J'ai déjà fait une erreur une fois quand j'utilisais "using" pour fermer la connexion de service et j'ai peur de faire quelque chose de mal à nouveau.

Est-ce que quelqu'un peut donc dire si ma façon d'appeler le service WCF est correcte ou non dans toutes les circonstances (le cas le plus rare)?

+0

Avez-vous vérifié les exceptions dans votre bloc catch? –

+0

L'exception est "html/text reçu au lieu de xml/text". Mais c'est parce que IIS a renvoyé la page "erreur de service 500". –

Répondre

1

Je suggère:

var client = new TestClient(); 
try 
{  
    response = client.Operation(request); 
    client.Close(); 
} 
catch 
{ 
    client.Abort(); 
} 

La façon dont vous faites, vous n'êtes pas avorte si quelque chose va mal, puisque vos prises est à l'intérieur du bloc finally. Si vous voulez utiliser le code que vous avez aujourd'hui, je pense que vous devez le changer pour:

var client = new TestClient(); 
try 
{  
    response = client.Operation(request); 
} 
finally 
{  
    try 
    { 
     if (client.State != CommunicationState.Faulted) 
      client.Close(); 
     else 
      client.Abort(); // Abort if the State is Faulted. 
    } 
    catch (Exception) 
    { 
     client.Abort(); 
    } 
} 
0

Utilisez cette option pour activer la journalisation de trace sur le service

<system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" 
        switchValue="Information, ActivityTracing" 
        propagateActivity="true"> 
      <listeners> 
       <add name="traceListener" 
        type="System.Diagnostics.XmlWriterTraceListener" 
        initializeData= "c:\logs\Traces.svclog" /> 
      </listeners> 
     </source> 
     </sources> 
    </system.diagnostics> 

Fiddler peut aussi aider, aussi juste essayer de saisir le WSDL via un navigateur Web au cours de ces 15 minutes.

Questions connexes