I trying to merge the use of several technologies in a web application. Most of the Rx code is already tested in Test Projects and everything seems to be working correctly. But I'm having some exceptions when I try to make it work in the app environment (IIS):
Object reference not set to an instance of an object.
at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)
at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext)
at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state)
at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state)
at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state)
at System.Reactive.Concurrency.SynchronizationContextExtensions.PostWithStartComplete(SynchronizationContext context, Action action)
at System.Reactive.Concurrency.SynchronizationContextScheduler.Schedule[TState](TState state, Func`3 action)
at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Action action)
at System.Reactive.Linq.ObservableImpl.EventProducer`2.Session.<>c__DisplayClass3.<Connect>b__2()
at System.Reactive.Disposables.AnonymousDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Sink`1.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.ObserveOnObserver`1.Dispose(Boolean disposing)
at System.Reactive.ObserverBase`1.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.RefCountDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Sink`1.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.ObserveOnObserver`1.Dispose(Boolean disposing)
at System.Reactive.ObserverBase`1.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Disposables.CompositeDisposable.Dispose()
at System.Reactive.Disposables.SingleAssignmentDisposable.Dispose()
at System.Reactive.Sink`1.Dispose()
at System.Reactive.Linq.ObservableImpl.SelectMany`2._.Iter.OnError(Exception error)
at System.Reactive.ScheduledObserver`1.Run(Object state, Action`1 recurse)
at System.Reactive.Concurrency.Scheduler.<>c__DisplayClass10`1.<InvokeRec1>b__d(TState state1)
at System.Reactive.Concurrency.Scheduler.InvokeRec1[TState](IScheduler scheduler, Pair`2 pair)
at System.Reactive.Concurrency.ScheduledItem`2.InvokeCore()
at System.Reactive.Concurrency.ScheduledItem`1.Invoke()
at System.Reactive.Concurrency.EventLoopScheduler.Run()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
I suspect that: "It's All About the SynchronizationContext
" or Rx Scheduler
, someone can give more information or details about it... Currently, I cannot find the cause or how to fix these problems, because all the exceptions are internal (from .NET libraries or Rx library).
Edit 1:
After some research I found other topics related, but there is no answer.
- Async logging throwing a NullReferenceException
- NullReferenceException in System.Threading.Tasks calling HttpClient.GetAsync(url)
- http://connect.microsoft.com/VisualStudio/feedback/details/745956/getting-null-reference-exception-in-asp-net-mvc-4-rc#
Edit 2: After spend a few hours to get this error in a sample app (incredibly in my test web app was working properly), here is the code that throws the error (this code is just for example).
https://github.com/jlVidal/WebForms-Signalr-And-Rx-Error
To simulate, please interact with the interface, subscribe, unsubscribe, disconnect, reconnect.. I always have an error when I click to subscribe some ID, and close the page (it calls OnDisconnected
method) and throws NullReferenceException
with the stack trace similar to above.
After all.. I don't know if I found the cause, many observations may not make sense:
- I cannot create and manage my Rx subscriptions in the creation of hub, or do something similar.. I did it because of the lazy loading. In fact the moment where I manage my subscriptions (Subscribe) affects the whole, if I move this code, apparently seems to stop to give error.
- The error occurs often in the
OnDisconnected
(SignalR Hub method), but it is almost random, I really don't found a pattern.
Someone can give me a light?