我需要知道在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与上述类似的堆栈跟踪。

毕竟. .我不知道我是否找到了原因,许多观察可能没有意义:

  1. 我不能在创建hub时创建和管理我的Rx订阅,或者做类似的事情。我这样做是因为惰性加载。事实上,当我管理我的订阅(订阅)影响整个,如果我移动这个代码,显然似乎停止给出错误。
  2. 错误经常发生在OnDisconnected (SignalR Hub方法),但它几乎是随机的,我真的没有发现一个模式。
谁能给我个火?

我需要知道在web应用程序中使用Rx(使用SignalR)

您在SomeHub中的代码以一种非常线程不安全的方式访问全局字典(_all)。此字典包含SortedSet实例,这些实例也以线程不安全的方式被访问。

至少有一些"随机"崩溃可能是由线程不安全代码中的竞争条件引起的。让你的SomeHub代码线程安全,然后看看这是否解决了任何或所有的错误。

这个问题似乎通过为最新版本和/或Microsoft ASP更新NuGet包来解决。. NET产品更新