我需要知道在web应用程序中使用Rx(使用SignalR)
本文关键字:Rx 使用 SignalR 应用程序 web | 更新日期: 2023-09-27 18:03:29
我试图在一个web应用程序中合并使用几种技术。大多数Rx代码已经在Test Projects中测试过了,一切似乎都工作正常。但是当我试图使它在应用程序环境(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()
我怀疑:"It's All About the SynchronizationContext
"或Rx Scheduler
,有人可以提供更多的信息或细节…目前,我找不到原因或如何解决这些问题,因为所有的异常都是内部的(来自。net库或Rx库)。
编辑1:经过一番研究,我找到了其他相关的话题,但没有答案。
-异步日志抛出NullReferenceException
-在System.Threading.Tasks中调用HttpClient.GetAsync(url)
- http://connect.microsoft.com/VisualStudio/feedback/details/745956/getting-null-reference-exception-in-asp-net-mvc-4-rc
编辑2:在花了几个小时在示例应用程序中获得此错误后(令人难以置信的是,在我的测试web应用程序中工作正常),这里是抛出错误的代码(此代码只是举个例子)。
https://github.com/jlVidal/WebForms-Signalr-And-Rx-Error
要模拟,请与界面交互,订阅,退订,断开,重新连接…我总是有一个错误,当我点击订阅一些ID,并关闭页面(它调用OnDisconnected
方法),并抛出NullReferenceException
与上述类似的堆栈跟踪。
毕竟. .我不知道我是否找到了原因,许多观察可能没有意义:
- 我不能在创建hub时创建和管理我的Rx订阅,或者做类似的事情。我这样做是因为惰性加载。事实上,当我管理我的订阅(订阅)影响整个,如果我移动这个代码,显然似乎停止给出错误。
- 错误经常发生在
OnDisconnected
(SignalR Hub方法),但它几乎是随机的,我真的没有发现一个模式。
您在SomeHub
中的代码以一种非常线程不安全的方式访问全局字典(_all
)。此字典包含SortedSet
实例,这些实例也以线程不安全的方式被访问。
至少有一些"随机"崩溃可能是由线程不安全代码中的竞争条件引起的。让你的SomeHub
代码线程安全,然后看看这是否解决了任何或所有的错误。
这个问题似乎通过为最新版本和/或Microsoft ASP更新NuGet包来解决。. NET产品更新