исключение обратного вызова wcf после обновления до .net 4.0 - PullRequest
11 голосов
/ 02 июня 2010

У меня есть служба wcf, которая использует обратные вызовы с DualHttpBindings. Служба возвращает клиенту список результатов поиска (для длительного поиска) по мере их поиска.

Это нормально работало в .Net 3.5. Поскольку я обновил до .Net 4.0, он взрывается с System.Runtime.FatalException, который фактически убивает рабочий процесс IIS. Я понятия не имею, как вообще начать исправлять это. Любые рекомендации приветствуются.

Информация из полученных журналов событий вставлена ​​ниже:


Произошло необработанное исключение и процесс был прерван.

Идентификатор приложения: / LM / W3SVC / 2 / ROOT / CP

Идентификатор процесса: 5284

> Исключение: System.Runtime.FatalException

> Сообщение: ссылка на объект не установлена ​​на экземпляр объекта.

StackTrace : в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) в System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump (RequestContext запрос, логическое значение cleanThread, OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest (RequestContext запрос, OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump (IAsyncResult результат) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult результат) в System.Runtime.AsyncResult.Complete (Boolean завершено синхронно) в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch () в System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage (WsrmMessageInfo информация) в System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete (IAsyncResult результат) в System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic (IAsyncResult результат) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult результат) в System.Runtime.AsyncResult.Complete (Boolean завершено синхронно) в System.ServiceModel.Channels.ReliableChannelBinder 1.InputAsyncResult 1.OnInputComplete (IAsyncResult результат) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult результат) в System.Runtime.AsyncResult.Complete (Boolean завершено синхронно) в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch () в System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * nativeOverlapped)
в System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (UInt32 ошибка, UInt32 bytesRead, NativeOverlapped * nativeOverlapped)
в System.Threading._IOCompletionCallback.PerformIOCompletionCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * POVERLAP)

> InnerException: > System.NullReferenceException

Сообщение : ссылка на объект не установлена ​​на экземпляр объекта.

StackTrace : в System.Web.HttpApplication.ThreadContext.Enter (Boolean setImpersonationContext) в System.Web.HttpApplication.OnThreadEnterPrivate (Boolean setImpersonationContext) в System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock (SendOrPostCallback обратный вызов, состояние объекта) в System.Web.AspNetSynchronizationContext.CallCallback (SendOrPostCallback обратный вызов, состояние объекта) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC)

1 Ответ

15 голосов
/ 03 июня 2010

ОК - я нашел ответ. Очень странно, но просто поместите следующий атрибут в класс оболочки обратного вызова WCF:

[CallbackBehavior(UseSynchronizationContext=false)]

Спасибо Cauldwell.net за ответ: http://www.cauldwell.net/patrick/blog/CategoryView,category,CodeGen.aspx

от cauldwell.net:

Проблема, как оказалось, заключалась в том, что ASP.NET использует (по умолчанию) немного вещь называется SynchronizationContext. Так близко, как я могу сказать (я не исследовал это если честно) один из его работа, чтобы убедиться, что любой обратные вызовы запускаются в потоке пользовательского интерфейса, тем самым устраняя необходимость вызова Control.Invoke, как вы делаете в WinForms. В моем случае это дополнительное замок давал что-то, и это пытался убрать вещи на нить, которой больше не было, следовательно, к NullReferenceException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...