2009-11-12 8 views
5

Ich habe ein WCF-Beispielprojekt, das ein Problem reproduziert, das ich mit meiner echten WCF-Anwendung habe. Sie können den Quellcode meiner Probe WCF-Anwendung herunterladen hereDas Kommunikationsobjekt kann nicht für die Kommunikation verwendet werden, weil es abgebrochen wurde

den Timeouts Sätze in den Code und Konfigurationsdateien Accoding, ich verstehe nicht, was appening:

**** Server exception : System.ServiceModel.CommunicationObjectAbortedException: 

The communication object, System.ServiceModel.Security.SecuritySessionServerSettings+SecurityReplySessionChannel, cannot be used for communication because it 
has been Aborted. 

    at System.ServiceModel.Channels.CommunicationObject.ThrowIfClosedOrNotOpen() 
    at System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.SecureApplicationMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionServerSettings.SecuritySessionRequestContext.OnReply(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestContextBase.Reply(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestContextBase.Reply(Message message) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Reply(MessageRpc& rpc) 

**** client exception : : System.ServiceModel.Security.MessageSecurityException: An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail. ---> System.ServiceModel.FaultException: The message could not be processed. This is most likely because the action 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT/Cancel' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding. 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.ProcessRequestContext(RequestContext requestContext, TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.ReceiveInternal(TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.CloseOutputSession(TimeSpan timeout) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.CloseSession(TimeSpan timeout, Boolean& wasAborted) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 

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 System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ClientBase`1.Close() 
    at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose() 
    at WindowsFormsApplication1.Program.Main() in C:\Users\sdoucet\Documents\Visual Studio 2008\Projects\TestWCFLongExecution\WindowsFormsApplication1\Program.cs:line 25 

Antwort

1

Sieht aus wie Sie vorbei sind Ausnahmen zurück zum Client. WCF mag keine regulären Ausnahmen, will Fehler oder eine FaultException im Falle von Fehlern. Nach und Ausnahme wurde zurückgegeben, der Kanal befindet sich in einem fehlerhaften Zustand und kann nicht erneut verwandt werden. Nach einer FaultException ist der Kanal noch verwendbar.

+0

Sie haben Recht, aber die Ausnahme wird nicht von meinem Code ausgelöst. Es wird von der WCF-Infrastruktur ausgelöst. Ich möchte wissen, warum diese Ausnahme ausgelöst wird und wie man sie vermeidet. Ich weiß, dass mein Dienst für 10 Minuten läuft, aber gemäß den Timeouts-Sets verstehe ich die Ausnahme nicht. – Sebastien

+2

Als Erstes aktivieren Sie die vollständige Ablaufverfolgung im Service. Dies gibt Ihnen oft eine Menge Informationen darüber, was das ursprüngliche Problem ist. – Maurice

6

Wir hatten ein ähnliches Problem, weil der Anwendungspool, der den Dienst hostet, so konfiguriert wurde, dass maximale Arbeitsprozesse größer als 1 sind. Damit ein Aufruf von Abbruch oder Schließen erfolgreich ausgeführt werden kann, muss er an dieselbe Serviceinstanz weitergeleitet werden ursprüngliche Anfrage.

+1

Vielen Dank für die Veröffentlichung, ich hatte das gleiche Problem in unserer Kunden Staging-Umgebung. Einer ihrer Entwickler hat die "Maximale Arbeitsprozesse" auf 5 gesetzt, was diese Ausnahmen verursacht. Wir verwendeten wsfederationhttpbinding und haben auch einen Security Token Service (STS) installiert, wodurch die Ausnahme noch verwirrender wurde - was darauf hindeutet, dass das Token ungültig war. Tatsächlich wurde die Anfrage manchmal nur an den falschen Arbeitsprozess gerichtet. –

+0

Wir haben das gleiche Problem beobachtet und wir verwendeten wshttpbinding mit Nachrichtensicherheit. Netscalar Load Balancer vor den Web-Service-Maschinen machten das Ausprobieren noch schwieriger. Wir dachten zunächst, dass die LB keine klebrigen Sitzungen aufrechterhalte, und versuchten zu sehen, ob das Problem durch das Herausnehmen der LB aus der Gleichstellung gelöst werden würde. Aber das war es nicht, und das war, als wir feststellten, dass die Einstellung Maximale Arbeitsprozesse auf mehr als 1 eingestellt war. –

2

Ich hatte ein ähnliches Problem, wo ich einen asynchronen Anruf beim wcf-Dienst gemacht. Nach dem Empfang des Ergebnisses in der async_completed-Methode habe ich eine Ausnahme erhalten.

„Eine Ausnahme während des Betriebs aufgetreten ist, das Ergebnis ungültig machen Innerexception prüfen Ausnahme.“

Innerexception:
„Die Objektkommunikation nicht für die Kommunikation verwendet werden kann, weil es abgebrochen wurde“

Nach viel Mühe finde ich die Lösung, fangen Sie einfach die Ausnahme, ohne die async_completed Methode einzuwerfen. (d. h. implementiert den Versuch/Fang). Ich habe nicht verstanden, was genau das Problem ist, aber irgendwie bricht Kommunikationskanal.

habe ich versucht, die oben approch auf dem folgenden Link

http://geekswithblogs.net/SoftwareDoneRight/archive/2008/05/23/clean-up-wcf-clients--the-right-way.aspx

noch zuversichtlich, ich bin nicht, dass dies der richtige Ansatz ist, aber nach meinem Szenario mit dem Operationsergebnis furtherly ich nichts zu tun. Es ist also eine Ausnahme und stoppt den Dienst.

Verwandte Themen