Нет номеров строк в ошибках сервера ASP.NET - PullRequest
2 голосов
/ 28 марта 2012

Я использую 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">.

Кроме того, в свойствах моего проекта в разделе «Сборка» активна конфигурация «Отладка», а флажки констант DEBUG и TRACE включены.В разделе «Дополнительно» для «Внутренних отчетов об ошибках компилятора» установлено значение «Истина», а для «Отладочная информация» задано значение «Полная».

В учетной записи пользователя, под которой я работаю, включено право «Отладка программ» в политике безопасности своей группы.

Я исследовал этот вопрос здесь, в Переполнении стека и в других местах, но я не могу найти прямой ответ, который соответствует моей ситуации.Один из ответов, который я нашел, заключался в удалении параметра «impersonate = true» из web.config, который, по-видимому, применим к IIS, но я не использую IIS и не имею этого в своем конфигурационном файле.Я использую встроенный ASP.NET Development Server, который поставляется с VS 2010, вместо IIS.В другом ответе говорилось, что нужно настроить сервер символов и установить переменную _NT_SYMBOL_PATH env, но я не знаю, относится ли это к тому, что я делаю.

Это действительно сбивает с толку, потому что я использую настройки по умолчаниюи настройки для всего, и кажется, что это будет распространенной проблемой, с которой столкнется большинство разработчиков.Если все остальные не используют Publish и не занимаются разработкой через IIS.Между прочим, я еще не пробовал с IIS, чтобы увидеть, если я получаю номера строк, покаНо я хочу использовать встроенный сервер разработки ASP.NET - я ожидаю, что он будет по умолчанию отображать подробные сведения об отладке / трассировке исключений, и, возможно, даже интегрируется с VS 2010, чтобы разбить исключения и позволить мне пройти по коду.Но, может быть, я прошу слишком много.Кто-нибудь?

(Если вы ответите с предложенным решением, пожалуйста, сначала прочитайте детали моих настроек выше, чтобы вы могли увидеть, есть ли у меня уже настройки, которые вы предлагаете.)

Продолжение: Я пытался с IIS, и я получаю номера строк.Но это не решает проблему, потому что я хочу использовать облегченный сервер разработки.

1 Ответ

2 голосов
/ 30 марта 2012

Итак, я выяснил, что номера строк показывались нормально, когда исходный файл .CS вызывал исключение, но не тогда, когда исключение происходило в исходном файле .ASPX.Для самого .ASPX отрывок номера строки и исходного кода вообще не появлялся, будь то в IIS или Development Server.(Это не совсем то, как я описал проблему изначально в своем вопросе выше, так что это немного проясняет ситуацию.) Один из моих коллег сказал, что это просто нормальное поведение, и нет никакого способа обойти это.Он подразумевал, что вам нужно будет угадать, в какой строке находится исключение на вашей странице ASPX.

Однако после дополнительных исследований я нашел способ!Я могу получить номера строк, когда файл .ASPX вызывает исключение.Но я все еще не понимаю, почему это не так легко настроить!Как, например, опция на уровне страницы или проекта, вместо того, чтобы требовать добавления блока кода.

Следующий код должен быть в самом ASPX.CS каждой страницы, не в ееMaster Page, или в любом родительском классе, производном от класса 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...