如何在已部署的 ASP.Net 应用程序上跟踪错误?
Posted
技术标签:
【中文标题】如何在已部署的 ASP.Net 应用程序上跟踪错误?【英文标题】:How to trace Error on a Deployed ASP.Net Application? 【发布时间】:2011-07-14 22:24:25 【问题描述】:VS 2008 / ASP.Net
我在 Windows 2003 Server 上部署了一个 ASP.Net Web 应用程序。由于某些原因,它会引发错误。
应用程序在我的本地计算机上运行良好。来自源代码或托管在我的本地计算机上 (Windows XP)。
如何在已部署的 ASP.Net Web 应用程序上跟踪错误?
错误:
对象引用未设置为对象的实例。说明:一个 当前 web 执行过程中发生未处理的异常 要求。请查看堆栈跟踪以获取有关 错误及其源自代码的位置。
异常详细信息:System.NullReferenceException:没有对象引用 设置为对象的实例。
来源错误:
在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈跟踪:
[NullReferenceException: Object reference not set to an instance of an object.]
_Default.ExportRx30ToSalisburyAccessDB() +351
_Default.Button1_Click(Object sender, EventArgs e) +5
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
源代码:我正面临这个错误..
试试
Access.Application access1 = new Access.Application();
// Open the Access database for exclusive access
string sSalisburyAccessDB = Server.MapPath("~/App_Data/Salisbury.mdb");
access1.OpenCurrentDatabase(sSalisburyAccessDB, true, null);
// Drop the existing table data
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "drug");
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "patplan");
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "plans");
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "price");
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "rx");
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "patient");
access1.DoCmd.DeleteObject(Access.AcObjectType.acTable, "plntrak");
// Run the saved import
access1.DoCmd.RunSavedImportExport("SalisburyODBC");
// Close the database
access1.CloseCurrentDatabase();
// Quit MS Access
access1.Quit(Access.AcQuitOption.acQuitSaveAll);
Response.Write("successful");
catch (Exception ex)
Response.Write(ex.InnerException.Message);
【问题讨论】:
您是否尝试过在调试模式下部署应用程序? 不,我该怎么做?我在正常过程中部署! 应用程序正在调试模式下运行。默认情况下,Web Config -> Debug = True !! 【参考方案1】:尝试在 IIS Express 而不是 Cassini(内置的 Visual Studio 开发 Web 服务器)中运行您的应用。它们的行为不同,您可能有更好的机会在您的开发环境中重新创建问题。 IIS Express 就像真正的 IIS 一样运行,因此在您部署应用程序时不会有太多意外。
【讨论】:
【参考方案2】:尝试在调试模式下部署应用程序,这应该会为您提供发生错误的特定行号和代码文件。只需将其放在您的 web.config
文件中:
<configuration>
<system.web>
<compilation debug="true">
</system.web>
</configuration>
但是,一般来说,您不想deploy to final production in debug mode。相反,在您的应用程序中使用try...catch
块和良好的状态/异常日志记录来跟踪问题。
【讨论】:
+1 表示不将调试模式部署到 prod 并使用 try...catch 进行良好的日志记录。 默认调试 = "true" !!我正在使用 Try Catch Block @Chok - 我当然希望你不是在处理 debug = "true" 的生产网站。 在我们将应用程序发布到生产服务器之前,我们需要通过几个阶段! @Internal Testing Environment 我很震惊,但我还有很长的路要走!【参考方案3】:找到此类错误发生位置的最简单方法是将方法拆分为每个方法只做一件事。例如,与其添加// Run the saved import
的注释,不如为其创建一个方法 RunTheSavedImport(),这样您就可以更容易地直接从堆栈跟踪中检测错误发生在代码的哪一部分。
我可以看到,如果您提供的代码是完整的 ExportRx30ToSalisburyAccessDB 方法,则此错误的最可能原因是 DoCmd、AcQuitOption 或 AcObjectType 出于某种原因为空。由于栈没有进入Application,只能是这个方法里面的对象造成的。
【讨论】:
是的,我想是的。当您确切知道导致空引用异常的对象时,可能会更容易说出问题所在。现在你有几种不同的可能性,很难说这里到底发生了什么。【参考方案4】:[ObjectDisposedException: 无法访问已关闭的资源集。] System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase, Boolean isString) +1657 System.Resources.RuntimeResourceSet.GetString(String key, Boolean ignoreCase) +12 System .Resources.ResourceManager.GetString(String name, CultureInfoculture) +78 SourceCode.Workspace.OOBReports.ReportList.CreateChildControls() +347 System.Web.UI.Control.EnsureChildControls() +146 System.Web.UI.Control.PreRenderRecursiveInternal () +61 System.Web.UI.Control.PreRenderRecursiveInternal() +224 System.Web.UI.Control.PreRenderRecursiveInternal() +224 System.Web.UI.Control.PreRenderRecursiveInternal() +224 System.Web.UI.Control .PreRenderRecursiveInternal() +224 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3394
只需重置您的 IIS 服务器。
【讨论】:
我看不到您的消息和问题之间的链接以上是关于如何在已部署的 ASP.Net 应用程序上跟踪错误?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET - 部署问题 - 通过 Web.Config 启用堆栈跟踪/跟踪侦听器日志以查找内部服务器 500 错误的原因