Исключение обратного вызова 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.InputQueue1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.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.InputAsyncResult1.OnInputComplete (результат IAsyncResult) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(результат IAsyncResult) в System.Runtime.AsyncResult.Complete(Boolean completeSynchronously) в System.Runtime.InputQueue1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.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.

Другие вопросы по тегам