代码之家  ›  专栏  ›  技术社区  ›  Ali Imran

实时服务器有时关闭asp.net应用程序,找不到任何原因为什么?

  •  5
  • Ali Imran  · 技术社区  · 8 年前

    我的asp.net应用程序有时在实时服务器上关闭。所有用户都面临黄色错误屏幕。当我深入调查问题时,我发现了问题的根源。

    引发了“System.Web.HttpUnhandledException”类型的异常。 ===>stact trace====>位于System.Web.UI.Page.HandleError(异常e)位于System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔值includestagesafterasincpoint) 在System.Web.UI.Page.ProcessRequest(布尔值 includeStagesBeforeAsyncPoint,布尔值includestagesafterasincpoint) 在System.Web.UI.Page.ProcessRequest()上 System.Web.UI.Page.ProcessRequest(HttpContext上下文)位于 ASP.emr_patient_callbacks_patientappointments_aspx.ProcessRequest(HttpContext context)位于c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary中 ASP.NET Files\root\05f0ecab\db8ea090\App_Web_wgoawcvo.0.cs:0行位于 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.ieExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep步骤)上 System.Web.HttpApplication.ExecuteStep(IEExecutionStep步骤,布尔值& 同步完成)

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

    3 回复  |  直到 8 年前
        1
  •  2
  •   user1429080    8 年前

    仅凭你的堆栈跟踪很难确定地说出任何事情。但这里有一个可能的解释,网站正在关闭。

    IIS有一个名为 快速故障保护 ,它使用它来保护自己不受坏应用程序的影响。当 快速故障保护 一旦触发,IIS将关闭运行错误应用程序的应用程序池。当这种情况发生时,即使用户试图访问应用程序,应用程序池也不会自动启动。只有在web服务器上的管理员手动启动池之后,应用程序才会重新联机。

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

    我认为你的申请有时会触发 快速故障保护 在短时间内抛出几个未处理的异常。

    要解决此问题,您必须对应用程序进行编码,以便它不会抛出未处理的异常。添加 应用程序错误 处理您的 全球.asax 处理和记录异常(在其他地方没有发现)将是一个好的开始。

        2
  •  1
  •   mfvjunior    7 年前

    从您的异常消息中可以看出,这可能是与此视图相关的问题 病人软膏 (或与此视图同名的视图)。您需要检查是否所有关闭问题都是同一条消息,以确保每次都是同一个问题。

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

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

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

        3
  •  0
  •   na-98    7 年前

    欢迎来到一个有趣的世界,在一个圆孔中安装方钉,也就是ASP.NET Web表单中的异步编程。看一下stacktrace,我认为您正在.net 4.x中使用asp.net web表单,并在代码库中的某个地方执行异步编程。

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

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

    我要求你仔细检查你的代码库,找出你在哪里使用异步编程。查找关键字“async”“await”“Task”等,看看您是否正确使用了该模式,并且没有执行完全错误的操作,例如

    public async void Foo(){}
    

    您要么必须在整个请求生命周期中正确地执行异步,要么根本不执行异步。有时你不得不使用async,比如在我的例子中,我不得不使用一个以这种方式实现的库,或者使用async,但作为一种折衷,使请求同步。

    我建议你花点时间阅读一下。如果您确认要在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日志。下次死的时候,仔细查看日志文件,看看最后请求了哪些页面。另外,您在事件查看器中看到了什么?有时会有更详细的解释。

    顺便问一下,在生产中显示“黄色错误页”是怎么回事?请不要引发比您已经遇到的更多的问题,并使用自定义错误页和显示用户友好的错误消息。

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