передать порядковый номер ошибки ELMAH (не GUID) для исключения на страницу пользовательских ошибок в ASP.NET - PullRequest
0 голосов
/ 09 декабря 2010

Я хочу показать порядковый номер для исключения (из столбца порядкового номера в таблице ELMAH_Error), а не GUID для пользователя при возникновении ошибки.Это возможно?Я нашел это сообщение Проблема с передачей идентификатора журнала ELMAH на страницу Custom Error в ASP.NET , но он дает GUID, я хотел бы знать, как я могу получить доступ к порядковому номеру в событии Logged компонента ELMAH?заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 января 2011

Some Background ...

ELMAH предназначен для регистрации ошибок в указанном источнике журнала .Наиболее распространенным источником журнала является класс SqlErrorLog, который регистрирует ошибки в базе данных SQL Server и является частью базовой библиотеки ELMAH.Но есть и другие доступные источники журналов, которые регистрируют ошибки по адресу электронной почты, XML-файлу, базе данных Oracle и т. Д.

Порядковый номер, на который вы ссылаетесь, специфичен для SqlErrorLogучебный класс.Если вы посмотрите на другие источники журналов, такие как XmlFileErrorLog, вы увидите, что понятие порядкового номера отсутствует.

Учитывая это, неудивительно, что класс ELMAH Error- что представляет собой ошибку - не имеет свойства Sequence.«Последовательность» - это нечто конкретное для источника журнала SqlErrorLog.(Это можно увидеть далее, если вы изучите сценарий T-SQL, использованный для создания объектов базы данных для источника журнала SqlErrorLog - поле Sequence является столбцом IDENTITY и поэтому автоматически вычисляется базой данных при вставке.Это не значение, предоставляемое ELMAH.)

Возможное решение ...

MichaelvR предложил изменить исходный код ELMAH, но я бы предложил против этого, так как если вы это сделаете, вы будетепривязка вашей ветви ELMAH к определенному источнику журналов.Вместо этого возможно менее элегантное (и более простое!) Решение в следующем порядке:

  1. Создайте обработчик событий ErrorLog_Logged в Global.asax, как вы описали,
  2. Считайте ошибку Id значение (GUID) только что возникшей ошибки,
  3. Подключитесь к базе данных и напрямую запросите таблицу ELMAH_Error.

Вот пример запроса:

SELECT Sequence
FROM ELMAH_Error
WHERE ErrorId = TheErrorIdOfTheJustLoggedError

Что вы думаете об этом обходном пути?

Счастливого программирования!

1 голос
/ 06 января 2011

Просто подумав из коробки, сам не пробовал.

Вам нужно будет внести некоторые изменения в источник элмы и скомпилировать свою собственную маленькую версию Эльмы.Я не уверен, используется ли столбец последовательности, если вы настраиваете Elmah для входа в систему где-то еще.Вот шаги, которые, я думаю, вам нужно предпринять, вероятно, специфичные для ведения журнала SQL-сервера:

  1. Добавить свойство в тип Elmah.ErrorLogEntry для значения последовательности
  2. Изменить хранимую процедуру ELMAH_LogErrorтак что он возвращает значение, которое было вставлено в столбец последовательности.Столбец последовательности определен как столбец Identity, поэтому SQL-сервер автоматически генерирует значение для этого столбца при вставке.
  3. Измените код в методе Elmah.SqlErrorLog.GetError, чтобы он принимал значение последовательности, возвращенное сохраненными помещает его в свойство, добавленное вами в тип ErrorLogEntry.
...