Pourquoi mon WCF canal défectueux?
J'ai un ordinateur qui exécute un programme unique qui permet de gérer jusqu'à 48 processus individuels et sur les 4 autres ordinateurs. J'ai les services WCF (un pour chaque processus) mis en place en tant que tel:
public void StartService(Uri uri, string identifier)
{
unitMetaData = identifier;
var binding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
binding.ReliableSession.InactivityTimeout = TimeSpan.FromDays(20);
var reader = binding.ReaderQuotas as XmlDictionaryReaderQuotas;
reader.MaxStringContentLength = WCFContentSize; //16777216
service = new ServiceHost(this, uri);
service.Faulted += TestService_Faulted;
service.AddServiceEndpoint(
typeof(IController),
binding,
identifier);
service.Open();
}
Voici le code pour la télécommande processus:
public void Connect()
{
//External binding used to change the WCF XML text content size
var binding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
binding.ReliableSession.InactivityTimeout = TimeSpan.FromDays(20);
var reader = binding.ReaderQuotas as XmlDictionaryReaderQuotas;
reader.MaxStringContentLength = WCFContentSize; //16777216
DuplexChannelFactory<IController> factory = new DuplexChannelFactory<IController>(new InstanceContext(this), binding);
controllerChannel = factory.CreateChannel(new EndpointAddress(controllerAddress, new DnsEndpointIdentity(controllerAddress.DnsSafeHost), new System.ServiceModel.Channels.AddressHeaderCollection()));
((IClientChannel)controllerChannel).OperationTimeout = TimeSpan.FromSeconds(ChannelOperationTimeoutInSeconds); //300
controllerChannel.RequestTestData();
}
J'ai un code qui va appeler une distance "Ping()" qui retourne la chaîne de caractères "Pong" environ toutes les 30 secondes sur chaque processus à distance. J'ai fait cela pour s'assurer que la connexion reste ouverte comme j'ai eu des problème avec le ReliableSession calendrier. Parfois (comme dans beaucoup trop souvent pour la production de code), je reçois l'exception suivante à partir d'une seule et généralement plus de services que les procédures de tests sont en cours de connexion:
An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServerReliableDuplexSessionChannel, cannot be used for communication because it is in the Faulted state.
Server stack trace:
at System.ServiceModel.Channels.TransmissionStrategy.WaitQueueAdder.Wait(TimeSpan timeout)
at System.ServiceModel.Channels.TransmissionStrategy.InternalAdd(Message message, Boolean isLast, TimeSpan timeout, Object state, MessageAttemptInfo& attemptInfo)
at System.ServiceModel.Channels.ReliableOutputConnection.InternalAddMessage(Message message, TimeSpan timeout, Object state, Boolean isLast)
at System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnSend(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.DuplexChannel.Send(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
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 SEL.MfgTestDev.ESS.ServiceContracts.ITestProcessClient.Ping()
at SEL.MfgTestDev.ESS.Testing.Service.TestService.Ping() in C:\Projects\Mfg_TestDev_ESS_Rev3\branches\MSU-5-18-2010\ESS.Testing.Service\TestService.cs:line 349
Alors que ce passe? Pourquoi est-il soudainement se retrouver dans un état faulted. Est-il un moyen d'obtenir la raison pour laquelle une connexion a reproché?
OriginalL'auteur MGSoto | 2010-08-18
Vous devez vous connecter pour publier un commentaire.
Pas une bonne idée pour un environnement de production, mais vous pouvez essayer d'activer WCF traçage sur le serveur et les clients. J'espère que vous allez trouver une meilleure description de l'erreur.
Btw. - vous eu des problèmes avec fiable, car il a expiré au bout de 10 minutes d'inactivité. Vous définissez le délai d'inactivité pour la fiabilité de session, mais il y a aussi recevoir délai d'attente sur la liaison qui est par défaut à 10 minutes. Si aucun message n'arrive dans 10 minutes, la session de l'application est fermée = instance de service est détruit et fiable de la fermeture de la session.
Edit:
La description du problème est insuffisante. Aussi l'architecture est très étrange. Il n'y a pas un service de communication avec 48 des clients de plus en duplex de 48 canaux, mais même des services de communication avec un 1 client sur duplex canaux. Cela peut bien sûr ajouter d'autres problèmes qui ne sont pas connus à partir de scénarios communs afin de diagnostics (suivi /compteurs de performance) est vraiment nécessaire!
Lors de la vérification du code de la méthode de connexion, il ressemble même à de rappel de client est un singleton de communication auprès de toutes les 48 services, n'est-ce pas? Ce simultanéité mode est utilisé sur ce rappel? Si la simultanéité mode est unique, il peut y avoir des problèmes de délai d'attente lors de l'appel de la fonction de rappel parce que la taille du message est défini à 16 MO. Si toutes les 48 processus envoie 16MO de message dans le même temps, ils seront en file d'attente et traitées dans l'ordre FIFO. Les paramètres par défaut des demandes de traitement dans 30 ans sinon exception délai est et le canal est en défaut. Si la concurrence est en mode multiplier il y a encore peut être quelques problèmes de synchronisation à l'intérieur de rappel de mise en œuvre.
Il y a 48 services en cours d'exécution au sein d'une seule application sur le PC hôte. Il y a (jusqu'à) 48 distinct des processus à distance en cours d'exécution sur 4 autres Pc. Je suis actuellement en utilisant ConcurrencyMode unique pour les deux extrémités de la communication. La partie sur la nécessité d'être traité dans 30 ans s'inscrit dans ce qui semble être le cas.
Le 16 MO était le problème, nous avons été complètement surcharge du réseau et des systèmes à un seul point lors de nos tests. Merci de nous aider (moi et Firoso) figure sur la question, nous avons, depuis, il réduit à 128KB, et il n'y a pas d'autres questions.
OriginalL'auteur Ladislav Mrnka
Votre canal peut être reproché à l'état, si vous n'avez pas de service intégrés exceptions à
FaultException
ouFaultException<T>
:http://blogs.msdn.com/b/pedram/archive/2008/01/25/wcf-error-handling-and-some-best-practices.aspx
Je suppose que ce que certains autres prestataires de services d'appel déclenche une exception, le canal est prise en défaut et puis, vous obtenez l'exception que vous décrivez, lorsque vous essayez d'exécuter la commande ping de service.
OriginalL'auteur Stefan Egli
En supposant que vous utilisez le même canal pour interroger le service distant que d'autres appels à distance (ce qui était le point entier de ce ping-ce pas?) il se pourrait que l'un des autres appels de méthode à l'exception/a expiré et faillées de votre chaîne?
Aussi, dans votre configuration pour ServiceBehaviors, est "includeExceptionDetailInFaults' true? par exemple,
Au cours de débogage c'est utile car elle permet de voir le message d'exception à partir du serveur, mais l'inconvénient est que si des défauts de votre canal de trop, donc dans un environnement de production, il est préférable de la laisser de côté.
Je pense que le includeExceptionDetailInFaults n'est pas recommandé pour la production seulement parce qu'il pourrait exposer les détails internes de votre système, c'est-à-liés à la sécurité-
OriginalL'auteur theburningmonk