CommunicationObjectAbortedException en service WCF canal alors que plusieurs de chargement des données
Je suis en utilisant WCF service dans mon application client-serveur et je suis confronté erreur suivante lors de la communication entre le serveur et le client.
Error Message =>> System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it has been Aborted.
Server stack trace:
at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen()
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 ServiceLib.ServiceCallbackInterfaces.IHostServiceCallback.SendEventAndStatus(String message, Boolean isBackupGenerated)
at ServiceLib.Services.DriversService.objDriver_EventReceived(Object sender, EventReceivedEventArgs e)
Scénario d'Application : Client est l'obtention de données de serveur via WCF service et à l'aide de nettcp de liaison. Le serveur est connecté à un périphérique réel et de générer 20 à 30 événements toutes les secondes. Les événements générés sont poussés à la chaîne de message à tous les clients connectés à l'aide de interface de rappel de la WCF. Ça fonctionne si le client n'aura pas de n'importe quel processus de charge (juste à l'événement de réception et d'affichage). Mais il donne une erreur quand nous faisons de certains processus de chargement à côté client et occupé pendant un certain temps.
Remarque: j'avais déjà réglé au maximum tous les délais d'attente dans nettcp de liaison comme ci-dessous, mais toujours problème n'est pas résolu.
NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None);
tcpBinding.MaxBufferPoolSize = 2147483647;
tcpBinding.MaxReceivedMessageSize = 2147483647;
tcpBinding.MaxBufferSize = 2147483647;
tcpBinding.ReaderQuotas.MaxStringContentLength = 2147483647;
tcpBinding.ReaderQuotas.MaxDepth = 2147483647;
tcpBinding.ReaderQuotas.MaxBytesPerRead = 2147483647;
tcpBinding.ReaderQuotas.MaxNameTableCharCount = 2147483647;
tcpBinding.ReaderQuotas.MaxArrayLength = 2147483647;
tcpBinding.SendTimeout = TimeSpan.MaxValue;
tcpBinding.ReceiveTimeout = TimeSpan.MaxValue;
tcpBinding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue;
Merci de me guider est-il de tous les autres paramètres nécessaires à canal de communication ou de liaison ?
Mise à JOUR : Erreur renvoyé par svc traceur :
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>131075</EventID>
<Type>3</Type>
<SubType Name="Error">0</SubType>
<Level>2</Level>
<TimeCreated SystemTime="2011-09-30T08:37:01.5691715Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="ServerUtility" ProcessID="2396" ThreadID="5" />
<Channel />
<Computer>TEST</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error">
<TraceIdentifier>http://msdn.microsoft.com/it-IT/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier>
<Description>Throwing an exception.</Description>
<AppDomain>ServerUtility.exe</AppDomain>
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '10675199.02:48:05.4775807'.</Message>
<StackTrace>
at System.ServiceModel.Channels.SocketConnection.EndRead()
at System.ServiceModel.Channels.DelegatingConnection.EndRead()
at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
at System.ServiceModel.Channels.SocketConnection.FinishRead()
at System.ServiceModel.Channels.SocketConnection.AsyncReadCallback(Boolean haveResult, Int32 error, Int32 bytesRead)
at System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '10675199.02:48:05.4775807'. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
--- End of inner exception stack trace ---</ExceptionString>
<InnerException>
<ExceptionType>System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>An existing connection was forcibly closed by the remote host</Message>
<StackTrace>
at System.ServiceModel.Channels.SocketConnection.EndRead()
at System.ServiceModel.Channels.DelegatingConnection.EndRead()
at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
at System.ServiceModel.Channels.SocketConnection.FinishRead()
at System.ServiceModel.Channels.SocketConnection.AsyncReadCallback(Boolean haveResult, Int32 error, Int32 bytesRead)
at System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
</StackTrace>
<ExceptionString>System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host</ExceptionString>
<NativeErrorCode>2746</NativeErrorCode>
</InnerException>
</Exception>
</TraceRecord>
</DataItem>
</TraceData>
<System.Diagnostics xmlns="http://schemas.microsoft.com/2004/08/System.Diagnostics">
<LogicalOperationStack></LogicalOperationStack>
<Timestamp>4730654290080</Timestamp>
</System.Diagnostics>
</ApplicationData>
</E2ETraceEvent>
Ce que @Tim dit; pour ce faire utiliser la Visionneuse de Trace de Service, msdn.microsoft.com/en-us/library/ms732023.aspx
Je n'ai pas beaucoup d'idée sur la façon d'utiliser Visionneuse de Trace de Service. Pouvez-vous svp me guider ?
Vérifier le lien Jeremy posté.
En effet. En essence, vous aurez besoin d'ajuster votre configuration afin de créer des fichiers de trace, puis les visualiser avec la visionneuse de trace. Je vous recommande de retracer le client et le serveur. Il est également utile de rappeler que vous pouvez suivre la sérialisation trop: msdn.microsoft.com/en-us/library/dd788183(v=bts.70).aspx
OriginalL'auteur Upendra Chaudhari | 2011-09-30
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez mentionné dans votre question, vous avez défini tous les délais d'attente au maximum. Donc, selon mon avis, il devrait y avoir de problème dans InstanceContextMode que vous avez défini. Le mode dans lequel vous avez définis dans votre service ? PerSession, PerCall ou Unique. Il y a peut être PerCall que vous avez défini et d'appeler le service client par le même objet (déclarés globalement objet de service), il est alors possible de canal viennent en état de panne ou de déconnexion.
Donc, Si vous avez défini PerSession mode, puis utiliser un seul objet (déclarés Globalement) à partir du côté client pour obtenir des données de service. Si vous avez défini PerCall option, puis créer un nouvel objet à chaque fois.
Espère que cela contribuera à vous. N'hésitez pas à demander un doute...
Pouvez-vous décrire comment vous envoyer une notification d'événement pour tous les clients ? Je veux dire, pouvez-vous mettre un peu de code pour cela. Une chose de plus, c'est quand vous envoyer une notification d'événement pour les clients, à ce moment de l'appel à un autre service qui ont PerCall mode ?
Comme je vous l'ai dit précédemment, je suis de l'envoi de la notification d'événement à l'aide de la méthode de rappel et oui quand je change de mode de fonctionnement (superviseur, le programme d'installation hors ligne) dans mon application, je fais appel EventLogService pour enregistrer le mode de fonctionnement de données, donc il sera affiché à tous les clients connectés en tant que notification à partir du serveur.
Pouvez-vous s'il vous plaît vérifier en changeant PerSession mode EventLogService et l'utilisation déclarés globalement objet à appeler le service au client.
Oui, j'ai vérifié en procédant de la PerSession et globle objet, et il fonctionne très bien pour moi. Je ne sais pas ce qui était réel problème, mais pour l'instant ça fonctionne bien pour moi. Merci pour votre soutien.
OriginalL'auteur Chief