Можно ли изменить значение, возвращаемое Server.GetLastError ()? - PullRequest
0 голосов
/ 24 января 2019

Я написал HttpModule для ASP.NET, который будет проверять текущее исключение (если оно есть) и заключать его в новое исключение с уникальным идентификатором. Затем я хочу, чтобы Элма зарегистрировал это исключение для упаковки.

Мой модуль работает и находится перед модулем Elmah, однако я не могу понять, как изменить Server.GetLastError (), чтобы мое новое исключение было зарегистрировано!

Я пробовал:

var originalException = context.Server.GetLastError();
var app = (HttpApplication)sender;
var context = app.Context;
context.ClearError();
context.AddError(new WrapperException(originalException));

Но при этом свойство context.Error возвращает ноль.
На самом деле ClearError не выполняет то, что объявлено: "Удаляет все ошибки для текущего HTTP-запроса." Это не делает этого. Массив AllErrors все еще содержит исключения; все это заставляет GetLastError возвращать ноль.

Вы не можете ни устанавливать context.AllErrors, ни вставлять что-либо в массив (это копия).

Вы также не можете выдать новое исключение: страница ошибки видит только исходное исключение, а Элма даже не регистрирует его.

Я начинаю думать, что это невозможно.

1 Ответ

0 голосов
/ 25 января 2019

Если единственная причина, по которой вы хотите заменить Server.GetLastError(), заключается в том, чтобы убедиться, что ELMAH регистрирует правильные исключения, может быть лучший подход.Функция фильтрации ELMAH может использоваться для отмены зарегистрированного исключения.Для этого добавьте следующий код в файл Global.asax.cs:

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args)
{
    var httpContext = args.Context as HttpContext;
    ErrorLog.GetDefault(httpContext).Log(new Error(new WrapperException(args.Exception)));
    args.Dismiss();
}

ELMAH вызывает метод ErrorLog_Filtering непосредственно перед регистрацией любых неперехваченных исключений в сконфигурированном журнале ошибок.В этом примере я извлекаю информацию об ошибке (args.Context и args.Exception) и заключаю выброшенное исключение в новое исключение (WrapperException).Регистрируя новое исключение с помощью метода ErrorLog.GetDefault(...).Log(...), я удостоверяюсь, что ELMAH не вызывает рекурсивный метод ErrorLog_Filtering (это было бы, если бы вы использовали ErrorSignal...Raise()).Наконец, я исключаю исходное исключение, чтобы избежать регистрации ошибки дважды.

...