2010-03-24 7 views
2

J'ai un programme avec trois services WCF et quand je les exécute localement (c'est-à-dire: serveur et les clients sont tous sur localhost) tout fonctionne. Toutefois, lorsque je les teste sur un réseau, j'obtiens une exception TimoutException sur deux services mais pas sur l'autre. J'ai désactivé les pare-feu sur toutes les machines impliquées dans le test. Je peux à la fois pinguer le serveur et accéder à la page Web wsdl "Vous avez créé un service" du clientTimoutException se produit sur un réseau mais pas localement

Le service qui fonctionne utilise un BasicHttpBinding avec streaming et les deux qui ne fonctionnent pas utilisent WSDualHttpBinding. Les services qui utilisent WSDualHttpBinding ont tous deux CallbackContracts. Je m'excuse de l'imprécision de cette question, mais je ne suis pas vraiment sûr de savoir quel code inclure ou où commencer même à chercher la solution à cela.

liaisons non-travail:

public static Binding CreateHTTPBinding() 
{ 
    var binding = new WSDualHttpBinding(); 

    binding.MessageEncoding = WSMessageEncoding.Mtom; 

    binding.MaxBufferPoolSize = 2147483647; 
    binding.MaxReceivedMessageSize = 2147483647; 
    binding.Security.Mode = WSDualHttpSecurityMode.None; 
    return binding; 
} 

Exception Stack Trace:

Unhandled Exception: System.TimeoutException: The open operation did not complete within the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout. 

Server stack trace: 
    at System.ServiceModel.Channels.ReliableRequestor.ThrowTimeoutException() 
    at System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout) 
    at System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ClientReliableDuplexSessionChannel.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) 
    at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at IDemeService.Register() 
    at DemeServiceClient.Register() 
    at DemeClient.Client.Start() 
    at DemeClient.Program.Main(String[] args) 
+0

Modifier - a ajouté votre commentaire à la question et a supprimé ma réponse, –

+0

Avez-vous déjà été capable de résoudre ce problème? J'ai le même problème. Le client ne peut pas se connecter à l'hôte. J'ai activé le suivi et trouvé que le serveur reçoit la demande et envoie la réponse, mais pour une raison quelconque, le client expire. – DennyFerra

+0

Malheureusement pas. D'après ce que je me souviens, la trace a suggéré qu'il pourrait y avoir une forme de problème de sécurité qui causait le délai d'attente malgré la réception par le serveur des messages avec succès. – Gibsnag

Répondre

0

Vous utilisez un DualHttpBinding. Cela signifie que vous configurez un canal duplex, où le serveur peut envoyer des messages (pas un message de réponse, mais un message entrant) au client. Mais vous n'avez pas configuré un clientBaseAddress où le client sera à l'écoute des messages entrants provenant du serveur. C'est ce qui cause ce problème. Cette liaison requiert que le client dispose d'une URI publique qui fournit un point de terminaison de rappel pour le service. Ceci est fourni par ClientBaseAddress. Une double liaison expose l'adresse IP du client au service. Le client doit utiliser la sécurité pour s'assurer qu'il se connecte uniquement aux services auxquels il fait confiance.

Questions connexes