使用带有 SignalR 的 WebSockets 的 Web 应用程序在异常后崩溃池?

Web Application using WebSockets with SignalR crashes pool after exception or does it?

我们有一个复杂的 Web 应用程序,它使用 SignalR 与客户端通信,向他们发送有关视频编码器的更新。它每隔几秒就会向他们发送摄像机图像的快照、录制状态、录制的时间表信息等。

现在,在从编码器获取信息并将其推送到订阅的客户端的例程中发生以下异常后,应用程序有时会被回收:

    Core.Assemblers.ScheduleAssembler,Error,GetRecordingInfo failed,"System.Net.Http.HttpRequestException: Response status code does not indicate success: 503 (Service Unavailable).
   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   at Core.Clients.EncoderClient.<Request>d__25.MoveNext() in e:\jenkins\workspace\sources\Core\Clients\EncoderClient.cs:line 241
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Core.Clients.EncoderClient.<GetRecordingInfo>d__20.MoveNext() in e:\jenkins\workspace\sources\Core\Clients\EncoderClient.cs:line 162
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Core.Services.EncoderInfoService.<TryGetClientInfo>d__22.MoveNext() in e:\jenkins\workspace\sources\Services\EncoderInfoService.cs:line 272"~

我不确定来自 SignalR 的线程是否与请求相关联。否则,此异常将终止应用程序并解释当时回收池的原因。

this 文章中确认应用程序池在发生与 Reqeust 无关的异常后被回收。

我的问题是。这是池回收的原因吗?

不,此代码中的异常不会破坏应用程序池。我无法在本地重现该问题,它仍然在生产服务器上中断。我故意向可疑代码添加了一个 throw Exception,但应用程序在任何时候都没有被拆除。我暂时休息一下。

信号通信失败不影响申请进程。他们绝对不会拆除应用程序池。它们被处理和记录。您可以 enable SignalR tracing 在您的生产服务器上查看是否有线索。

你也确定你没有击中5000 concurrent web requests limit or the 1000 request queue limit吗?除此之外,您可能会被抛出 503,应用程序池拒绝任何进一步的连接。

在我看来,如果您确定回收仅在上述调用之后发生,则更有可能是您的编码器代码启动了一个抛出未处理异常的任务,从而卸载了应用程序池。