2010-06-02 9 views
11

Ich habe einen Dienst, der Callbacks mit DualHttpBindings verwendet. Der Dienst drückt eine Datentabelle von Suchergebnissen zurück, die der Client (für eine lange laufende Suche) bei seiner Suche findet.WCF Callback-Ausnahme nach dem Update auf. NET 4.0

Dies funktionierte in. NET 3.5. Seit ich auf .NET 4.0 aktualisiert habe, bombadiert es mit einer System.Runtime.FatalException, die den IIS-Arbeitsprozess tatsächlich beendet. Ich habe keine Ahnung, wie ich anfangen soll, das Problem zu beheben. Irgendwelche Empfehlungen geschätzt.


Eine nicht behandelte Ausnahme der Prozess beendet wurde aufgetreten und :

Die Informationen aus den resultierenden Ereignisprotokolle unten eingefügt wird.

ID Anwendung:/LM/W3SVC/2/root/CP

ID-Prozess: 5284

> Ausnahme: System.Runtime.FatalException

> Nachricht: Der Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

Stacktrace: bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & Rpc) bei System.ServiceModel.Dispatcher .MessageRpc.Process (Boolean isOperationContextSet) bei System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump (Request Anfrage, Boolean cleanThread, Operation currentOperationContext) bei System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest (Request Anfrage, Operation currentOperationContext) bei System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump (IAsyncResult Ergebnis) bei System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult Ergebnis) bei System.Runtime.AsyncResult.Complete (Boolean completedSynchronously) bei System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch() bei System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage (WsrmMessageInfo info) bei System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete (IAsyncResult Ergebnis) bei System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic (IAsyncResult Ergebnis) bei System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult Ergebnis) bei -System .Runtime.AsyncResult.Complete (Boolean completedSynchronously) bei System.ServiceModel.Channels.ReliableChannelBinder 1.InputAsyncResult 1.OnInputComplete (IAsyncResult Ergebnis) bei System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult Ergebnis) bei System.Runtime.AsyncResult.Complete (Boolean completedSynchronously) bei System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch() bei System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback (UInt32 errorcode, UInt32 numBytes, Native * Native)
bei System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (UInt32 Fehler, UInt32 bytesread, Native * Native)
bei System.Threading._IOCompletionCa llback.PerformIOCompletionCallback (UInt32 errorcode, UInt32 numBytes, Native * pOVERLAP)

> Innerexception: > System.NullReferenceException

Nachricht: Objektverweis nicht auf eine Instanz eines Set Objekt.

Stacktrace: bei System.Web.HttpApplication.ThreadContext.Enter (Boolean setImpersonationContext) bei System.Web.HttpApplication.OnThreadEnterPrivate (Boolean setImpersonationContext) bei System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock (SendOrPostCallback Rückruf, Objektzustand) bei System.Web.AspNetSynchronizationContext.CallCallback (SendOrPostCallback Rückruf, Objektzustand) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc)

Antwort

15

OK - fand ich die Antwort. Sehr Seltsam, aber einfach gesagt das folgende Attribut auf der WCF-Callback-Wrapper-Klasse:

[CallbackBehavior(UseSynchronizationContext=false)] 

Dank Cauldwell.net für die Antwort ein: http://www.cauldwell.net/patrick/blog/CategoryView,category,CodeGen.aspx

Von cauldwell.net:

Das Problem , stellte sich heraus, war das ASP.NET verwendet (standardmäßig) ein kleines Ding, das SynchronizationContext genannt wird. So nahe, wie ich sagen kann (ich nicht diese gründlich recherchiert haben, um ehrlich zu sein) eine seiner Jobs es sicher zu stellen, dass alle Rückrufe auf dem UI-Thread laufen lassen, vermieden wodurch die Notwendigkeit Steuerung aufrufen .Invoke wie Sie in WinForms tun. In meinem Fall, dass zusätzliche Schloss gab etwas passt, und es versuchte, Sachen auf einem Thread zu reinigen, die nicht mehr um war, daher NullReferenceException.

+0

+1 Stimme. Danke James, du sparst meine Zeit :) –

+0

Das hat den Trick gemacht!Obwohl mein Szenario ein bisschen anders als der Artikel in dem Sinne war, dass die Ausnahme ausgelöst wurde, bevor diese Callback-Methode aufgerufen wurde. – Jan

Verwandte Themen