Исключение обратного вызова wcf после обновления до.net 4.0
У меня есть служба 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, Boolean cleanThread, OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(запрос RequestContext, OperationContext currentOperationContext.SynessRync.Fx.AsyncThunk.UnhandledExceptionFrame(результат IAsyncResult) в System.Runtime.AsyncResult.Complete(Boolean completeSynchronously) в 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.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(результат IAsyncResult) в System.Runtime.AsyncResult.Complete(Boolean completeSynchronously) в System.ServiceModel.Channels.ReliableChannelBinder1.InputAsyncResult
1.OnInputComplete (результат IAsyncResult) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(результат IAsyncResult) в System.Runtime.AsyncResult.Complete(Boolean completeSynchronously) в System.Runtime.InputQueue1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue
1.Dispatch () в System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(код ошибки UInt32, numBytes UInt32, NativeOverlapped* nativeOverlapped)
в System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(ошибка UInt32, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
в System.Threading._IOCompletionCallback.PerformIOCompletionCallback(код ошибки UInt32, numBytes UInt32, NativeOverlapped * pOVERLAP)> InnerException: > System.NullReferenceException
Сообщение: ссылка на объект не установлена на экземпляр объекта.
StackTrace: в System.Web.HttpApplication.ThreadContext.Enter(логическое значение setImpersonationContext) в System.Web.HttpApplication.OnThreadEnterPrivate(логическое значение setImpersonationContext) в System.Web.AspNetSynchronizationConteback.ebback.allBackableOUO CallCallback (обратный вызов SendOrPostCallback, состояние объекта) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
1 ответ
ОК - я нашел ответ. Очень странно, но просто поместите следующий атрибут в класс оболочки обратного вызова 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.