2010-06-02 17 views
11

Tengo un servicio wcf que usa devoluciones de llamada con DualHttpBindings. El servicio devuelve una tabla de datos de resultados de búsqueda al cliente (para una búsqueda de larga ejecución) a medida que los encuentra.excepción de devolución de llamada del wcf después de actualizar a .net 4.0

Esto funcionó bien en .Net 3.5. Desde que actualicé a .Net 4.0, se dispara con System.Runtime.FatalException que realmente mata el proceso de trabajo de IIS. No tengo ni idea de cómo empezar a arreglar esto. Cualquier recomendación apreciada.

La información de los registros de eventos resultantes se pega a continuación:


producido una excepción no controlada y el proceso se terminó.

ID de aplicación:/LM/W3SVC/2/ROOT/CP

Proceso ID: 5284

> Excepción: System.Runtime.FatalException

> Mensaje: Referencia a objeto no establecido en una instancia de un objeto.

StackTrace: en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & RPC) en System.ServiceModel.Dispatcher .MessageRpc.Process (Boolean isOperationContextSet) en System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump (RequestContext solicitud, Boolean cleanThread, OperationContext currentOperationContext) en System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest (RequestContext solicitud, OperationContext currentOperationContext) en System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump (IAsyncResult resultado) en System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult resultado) en System.Runtime.AsyncResult.Complete (booleano completedSynchronously) en System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch() en System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage (WsrmMessageInfo información) a System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete (IAsyncResult resultado) en System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic (IAsyncResult resultado) en System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult resultado) en Sistema .Runtime.AsyncResult.Complete (Boolean completedSynchronously) en System.ServiceModel.Channels.ReliableChannelBinder 1.InputAsyncResult 1.OnInputComplete (IAsyncResult resultado) en System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult resultado) en System.Runtime.AsyncResult.Complete (Boolean completedSynchronously) en System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch() en System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback (UInt32 errorCode, uint32 numBytes, nativeOverlapped * nativeOverlapped)
en System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (UInt32 error , UInt32 BytesRead, nativeOverlapped * nativeOverlapped)
en System.Threading._IOCompletionCa llback.PerformIOCompletionCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * pOVERLAP)

> InnerException: > System.NullReferenceException

Mensaje: referencia a objeto no establecida una instancia de una objeto.

StackTrace: en System.Web.HttpApplication.ThreadContext.Enter (Boolean setImpersonationContext) en System.Web.HttpApplication.OnThreadEnterPrivate (Boolean setImpersonationContext) en System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock (SendOrPostCallback de devolución de llamada, el estado del objeto) en System.Web.AspNetSynchronizationContext.CallCallback (SendOrPostCallback devolución de llamada, objeto de estado) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC)

Respuesta

15

OK - He encontrado la respuesta. Muy extraño, pero en pocas palabras el siguiente atributo de la clase de devolución de llamada envoltura WCF:

[CallbackBehavior(UseSynchronizationContext=false)] 

Gracias a Cauldwell.net para la respuesta: http://www.cauldwell.net/patrick/blog/CategoryView,category,CodeGen.aspx

De cauldwell.net:

El problema , resultó, fue que ASP.NET utiliza (por defecto) una pequeña cosa llamada SynchronizationContext. Lo más cerca que puedo decir (no he investigado este a fondo, para ser honesto) Una de sus puestos de trabajo para asegurarse de que cualquier devoluciones de llamada consiguen ejecutan en el subproceso de interfaz de usuario, obviando de este modo la necesidad de llamar de Control . Invoque como lo hace en WinForms. En mi caso, esa cerradura adicional estaba dando algo se ajusta, y estaba tratando de limpiar cosas en un hilo que ya no estaba, por lo tanto a NullReferenceException.

+0

+1 voto. gracias James, ahorras mi tiempo :) –

+0

¡Eso funcionó!Aunque mi escenario era un poco diferente del artículo en el sentido de que se lanzó la excepción antes de invocar el método de devolución de llamada. – Jan

Cuestiones relacionadas