ASP.NET服务器错误中没有行号

时间:2012-03-28 16:25:03

标签: asp.net exception

我正在使用Visual Studio 2010和C#ASP.NET。当我使用F5键运行我的项目时,它启动了ASP.NET开发服务器,这是我用于工作的服务器,而不是IIS。

问题是,当我在/ application中出现“服务器错误”未处理的异常错误时,错误页面没有行号,也没有源文件名。只是一个错误描述和堆栈跟踪。例如:

Server Error in '/' Application.
DataField must be specified.   [or whatever error message]
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.InvalidOperationException: DataField must be specified.
Source Error: 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace: 
[etc]

我正在调试模式下编译。我的PDB正在我项目的BIN目录中生成。在我的项目属性中,在Web下,NTLM身份验证已关闭。在我的web.config中,我有以下内容:

<authentication mode="Forms">
[...]
<customErrors mode="Off"/>
[...]
<compilation debug="true" targetFramework="4.0">.

同样在我的项目属性中,在Build下,Debug配置处于活动状态,并且DEBUG和TRACE常量复选框已打开。在Advanced下,Internal Compiler Error Reporting设置为True,Debug Info设置为Full。

我运行的用户帐户在其组的安全策略中启用了“调试程序”权限。

我已经在Stack Overflow和其他地方研究了这个问题,但我似乎无法找到适合我情况的直接答案。我找到的一个答案涉及从web.config删除设置“impersonate = true”,这显然适用于IIS,但我没有使用IIS,我的配置文件中也没有。我正在使用VS 2010附带的内置ASP.NET开发服务器,而不是IIS。另一个答案是设置一个符号服务器,并设置_NT_SYMBOL_PATH env变量,但我不知道这是否适用于我正在做的事情。

这实在令人困惑,因为我正在使用默认设置和配置,看起来这似乎是大多数开发人员会遇到的常见问题。除非其他人都使用Publish并通过IIS进行开发。顺便说一下,我还没有尝试使用IIS来查看我是否获得了行号。但是我想使用内置的ASP.NET开发服务器 - 我希望它默认显示异常的完整调试/跟踪详细信息,甚至可以与VS 2010集成以打破异常并让我逐步完成代码。但也许我要求的太多了。任何人吗?

(如果您使用建议的解决方案回答,请先阅读上述设置的详细信息,以便了解我是否已经拥有您建议的设置。)

跟进:我尝试使用IIS,然后获取行号。但这并没有解决问题,因为我想使用轻量级的Development Server。

1 个答案:

答案 0 :(得分:2)

因此,我发现当.CS源文件引发异常时,行号显示正常,但在.ASPX源文件中发生异常时则不行。对于.ASPX本身,无论是在IIS还是在开发服务器中,行号和源代码摘录都没有出现。 (这不完全是我在上面的问题中描述的问题,所以这有点澄清了一些事情。)我的一位同事说这只是正常的行为,没有办法绕过它。他暗示你必须猜测ASPX页面中的例外是哪一行。

然而,经过更多的研究,我找到了办法!当.ASPX文件导致异常时,我可以获取行号。但我仍然不明白为什么这不容易设置!就像页面或项目级别的选项一样,而不需要添加代码块。

以下代码必须位于每个页面的ASPX.CS本身,其主页中的不是也不是在从Page类派生的任何父类中(页面可能是继承自)。这是因为如果调用其他类的Page_Error处理程序,则调用堆栈会受到影响,并且最新的条目与错误无关。 (我也是通过遍历调用堆栈来寻找解决方案。这似乎是可能的,但我已经没时间了,现在就放弃了。)

public void Page_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();

StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(0);
Response.Write("File Name: " + sf.GetFileName().ToString() + "<br>");
Response.Write("Method Name: " + sf.GetMethod().Name.ToString() + "<br>");
Response.Write("Error Line Number: " + (sf.GetFileLineNumber() - 1) + "<br>"); // line numbers are offset by 1 for some reason
Response.Write("Error Column Number: " + sf.GetFileColumnNumber().ToString() + "<br>");

Server.ClearError();
}