2010-01-21 7 views
0

Je rencontre un problème très étrange avec WCF. J'ai besoin d'implémenter un comportement de récupération pour le service WCF si l'adresse IP du point de terminaison n'est pas accessible ou si le service ne peut pas être lié. Le flux est simple si l'application échoue à l'exception lors de la création du service, le termine et demande à l'utilisateur une autre adresse IP et effectue une autre tentative de création du service. (L'extrait de code ci-dessous). Si l'adresse n'est pas valide je reçois "Une erreur TCP (10049: l'adresse demandée n'est pas valide dans son contexte) s'est produite lors de l'écoute sur IP Endpoint = .121.10.11.11" exception, mais pour une raison quelconque si j'essaye la deuxième tentative avec adresse valide J'ai la même exception avec une mauvaise adresse IP de la tentative précédente. Voici un code:WCF envoie la même exception même si l'adresse du point de terminaison du service est valide

ServiceHost service = null; 
try 
{ 
    Uri[] uris = { new Uri(Constants.PROTOCOL + "://" + address + ":" + port) }; 
    service = new ServiceHost(typeof(IRemoteService), uris); 
    NetTcpBinding tcpBinding = 
     WcfTcpRemoteServicesManager.LessLimitedNewNetTcpBinding(int.MaxValue, 
      int.MaxValue, int.MaxValue); 
    ServiceEndpoint ep = service.AddServiceEndpoint(implementedContract.FullName, 
     tcpBinding, serviceName); 
    var throttle = 
     service.Description.Behaviors.Find<ServiceThrottlingBehavior>(); 
    if (throttle == null) 
    { 
     throttle = new ServiceThrottlingBehavior 
     { 
      MaxConcurrentCalls = Constants.MAX_CONCURRENT_CALLS, 
      MaxConcurrentSessions = Constants.MAX_CONCURRENT_SESSIONS, 
      MaxConcurrentInstances = Constants.MAX_CONCURRENT_INSTANCES 
     }; 
     service.Description.Behaviors.Add(throttle); 
    } 
    service.Open(); 

} 
catch (Exception e) 
{ 
    _debugLog.WriteLineMessage(
     "Failed to open or create service exception. Exception message:" + 
      e.Message); 
    if (service!=null) 
    { 
     try 
     { 
      service.Close(); 
     } 
     catch (Exception) 
     { 
      service.Abort(); 
      service.Close(); 
      throw e; 
     } 
    } 
} 

Merci

Répondre

0

Vous attrapez exception e, puis plus tard, vous attrapez une autre exception, mais vous jetez l'e d'exception originale.

Vous ne savez pas si c'est votre problème, mais vous risquez d'obtenir une exception confuse.

EDIT

Maintenant, j'ai lu un peu plus attentivement.

Le problème est une discordance entre le contexte et l'adresse. Je vois que le code utilise netTcpBinding:

  • Vérifiez que l'adresse correspond, quelle est la valeur de CONSTANTS.Protocol?
  • Vérifiez qu'il n'y a pas de conflit dans les fichiers de configuration.
+0

Ceci est un comportement attendu, je veux mettre à jour le niveau supérieur qui était ici levé exception, mais fermez le ServiceHost gracieusement. – ALexr111

+0

Mais vous ne le lancez que si la fermeture de l'hôte de service génère une exception. Si la fermeture de l'hôte de service fonctionne, le niveau supérieur ne recevra pas l'exception –

+0

Vous avez raison, la même ligne devrait être ajoutée à l'exception supérieure, mais malheureusement le problème initial n'est toujours pas résolu. – ALexr111

Questions connexes