【问题标题】:What I need to know to use Rx in web apps (using SignalR)在 Web 应用程序中使用 Rx 需要了解的内容(使用 SignalR)
【发布时间】:2015-01-09 04:50:10
【问题描述】:

我试图在一个 Web 应用程序中合并使用多种技术。 大多数 Rx 代码已经在测试项目中进行了测试,一切似乎都正常工作。但是当我尝试使其在应用程序环境(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: 经过一些研究,我发现了其他相关的主题,但没有答案。
- 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#

编辑 2: 花了几个小时在示例应用程序中得到这个错误(难以置信地在我的测试网络应用程序中正常工作)后,这里是引发错误的代码(此代码只是示例)。

https://github.com/jlVidal/WebForms-Signalr-And-Rx-Error
模拟,请与界面交互,订阅,取消订阅,断开连接,重新连接..点击订阅某个ID,关闭页面时总是报错(它调用OnDisconnected方法)并抛出@987654329 @ 与上面类似的堆栈跟踪。

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

  1. 我无法在创建集线器时创建和管理我的 Rx 订阅,或者做类似的事情。我这样做是因为延迟加载。事实上,我管理订阅的那一刻 (Subscribe) 会影响整体,如果我移动这段代码,显然似乎停止给出错误。
  2. 这个错误经常出现在OnDisconnected(SignalR Hub方法),但是几乎是随机的,我真的没有找到规律。

谁能给我一盏灯?

【问题讨论】:

    标签: c# .net .net-4.0 signalr system.reactive


    【解决方案1】:

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

    至少您的一些“随机”崩溃可能是由线程不安全代码中的竞争条件引起的。使您的 SomeHub 代码线程安全,然后查看是否可以解决您的任何或所有错误。

    【讨论】:

    • 我知道这不是线程安全的代码,但是如果有问题,很明显堆栈跟踪会有所不同,将代码更改为使用并发集合(或处理多线程) 不会使应用停止抛出异常。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2013-10-27
      • 1970-01-01
      • 2019-04-27
      • 2015-01-13
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多