实时服务器宕机 有时 asp.net 应用程序,找不到任何原因?

Live server down Sometimes asp.net application, don't find any reason why?

我的 asp.net 应用程序在实时服务器上有时会宕机。所有用户都面临黄色错误屏幕。当我深入研究问题时,我找到了踪迹。

Exception of type 'System.Web.HttpUnhandledException' was thrown. =====>stact trace====> at System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.emr_patient_callbacks_patientappointments_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\rootf0ecab\db8ea090\App_Web_wgoawcvo.0.cs:line 0 at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

此异常随机发生,而不是特定位置或特定点击。 但是当我在 IIS 上重新启动我的应用程序时,应用程序工作正常。但几个小时后又出现了同样的问题。

仅根据您的堆栈跟踪很难确定地说出任何事情。但这是网站关闭的一种可能解释。

IIS 有一个叫做 快速故障保护 的东西,它用来尝试保护自己免受不良应用程序的侵害。当 快速失败保护 被触发时,IIS 关闭应用程序池 运行 坏的应用程序。发生这种情况时,即使用户尝试访问应用程序,应用程序池也不会自动启动。只有在 Web 服务器上的管理员手动启动池后,应用程序才会恢复在线。

可以触发快速故障保护的一件事是应用程序在短时间内反复崩溃window。我认为默认值是 5 分钟内崩溃 5 次。

我认为您的应用程序有时会通过在短时间内抛出多个未处理的异常来触发 快速失败保护 window。

要解决此问题,您必须对应用程序进行编码,使其不会抛出未处理的异常。添加一个 Application_Error 处理程序到你的 Global.asax 来处理和记录异常(未在其他地方捕获)将是一个好的开始。

欢迎来到在圆孔中安装方钉的迷人世界a.k.a ASP.NET Web 窗体中的异步编程。查看堆栈跟踪,我认为您正在 .NET 4.x 中使用 asp.net 网络表单,并在您的代码库中的某处进行异步编程。

当我不得不在 asp.net webform (.aspx/.aspx.cs) 中使用异步模式时,我花了无数个小时来对随机死锁进行分类。我发现有时页面永远旋转或以悲惨的方式下降,就像你的情况一样。

很大程度上与 MSFT 在必须使其与 Web 表单兼容时允许您进行异步编程的松散程度有关。在 Web 表单中使用 Async/Await 模式有一种正确的方法,一种错误的方法会导致重大问题。

我会要求您仔细查看您的代码库并找到您在何处使用异步编程。查找关键字 "async" "await"、"Task" 等,看看您是否正确使用了该模式并且没有做一些完全错误的事情,例如

之类的方法
public async void Foo(){}

您要么必须在整个请求生命周期中正确执行异步,要么根本不执行。有时您不得不使用异步,例如在我的情况下,我不得不使用以这种方式实现的库或使用异步但同步发出请求作为妥协。

我建议您花一些时间阅读这篇文章。如果您确认您正在 Web 表单中执行异步操作,这里有几个链接可以帮助您入门。

https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

https://blog.stephencleary.com/2012/02/async-and-await.html

https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

How and When to use `async` and `await`

An async/await example that causes a deadlock

您还可以做的另一件事是尝试确定 IIS 何时开始死机。这将帮助您查明代码路径或胜过错误的页面。在重新启动 IIS 服务器之前,再次清除 IIS 日志。下次它死了,仔细看看日志文件,看看最后请求了哪些页面。此外,您在事件查看器中看到了什么?有时那里会提供更详细的解释。

顺便说一句,生产中正在做什么显示 "yellow error page"?请不要自找麻烦,使用自定义错误页面并显示用户友好的错误消息。

祝你好运,让我们知道你发现了什么。

据我从您的异常消息中可以看出,这可能是与此视图 patientappointments_aspx(或与此名称相似的视图)相关的问题).您需要检查是否所有关闭问题都出现在同一消息中,以确保每次都是相同的问题。

如果您有权访问部署环境,则可以通过事件日志进行跟踪。

跟踪此错误的另一个建议是使用更广泛的 try-catch 组合来跟踪您的应用程序生成的所有异常(这需要是一个临时解决方案,只是为了确定问题原因)。为了区分您处理的异常,您可以创建一个特定的异常和那些无法识别为一般异常的异常。

我希望这有助于追踪您的问题!