我们有一个复杂的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中的线程是否与Request相关联。如果不是,那么此异常将导致应用程序崩溃,并解释为什么当时要回收该池。
在this文章中,已确认在未与Reqeust绑定的异常之后,应用程序池已回收。
我的问题是。这是泳池回收的原因吗?
答案 0 :(得分:0)
否,此代码中的异常不会破坏应用程序池。我无法在本地重现该问题,但它仍在生产服务器上中断。我故意在可疑代码中添加了throw Exception,但该应用程序在任何时候都不会崩溃。我现在要休息一下。
答案 1 :(得分:0)
信号通信失败不会影响应用程序过程。他们绝对不会拆除应用程序池。它们被处理并记录。您可以在生产服务器上enable SignalR tracing,看看是否有线索。
您还确定没有击中5000 concurrent web requests limit or the 1000 request queue limit吗?除此之外,您可能会因为应用程序池拒绝任何其他连接而被抛出503s。
我认为,如果您确定回收仅在上述调用之后发生,则很有可能是您的编码器代码启动了一个Task,该Task抛出未处理的异常,从而卸载了应用程序池。