Używam kodu, który musi zostać uruchomiony tylko raz, ale zależy to od zasobów zewnętrznych i może się nie udać. Chcę, aby błąd pojawił się w dzienniku zdarzeń, ale nie chcę, aby użytkownik go widział. Chciałbym unikać używania niestandardowych stron błędów, jeśli to możliwe.Najczystszy sposób na zgłoszenie błędu, ale nie pokazanie użytkownikowi, że został on skorygowany (bez niestandardowych stron błędów).
Mogę wychwycić wyjątek i zapisać go w dzienniku zdarzeń, ale jestem zaniepokojony, że nie mogę zagwarantować, jaka będzie nazwa źródła zdarzeń asp.net (wydaje się zmieniać w zależności od wersji szkieletu .) Nie mogę też utworzyć własnego źródła zdarzeń, ponieważ wymaga to uprawnień administracyjnych.
Podejście, które Obecnie pracuję w kierunku jest trochę hack (która jeszcze nie działa) i wygląda to tak:
public void Init(HttpApplication context)
{
try
{
throw new Exception("test"); // This is where the code that errors would go
}
catch (Exception ex)
{
HttpContext.Current.Application.Add("CompilationFailed", ex);
}
}
private void context_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Application.AllKeys.Contains("CompilationFailed"))
{
// It failed on Init - we can't throw an exception there so lets try it here
var origEx = (Exception)HttpContext.Current.Application["CompilationFailed"];
// Only ever do this once
HttpContext.Current.Application.Remove("CompilationFailed");
// This should just look like a normal page load to the user
// - it will be the first request to the site so we won't be
// interrupting any postbacks or anything
HttpContext.Current.Response.AddHeader("Location", "/");
HttpContext.Current.Response.StatusCode = 301;
try
{
HttpContext.Current.Response.End();
}
catch (ThreadAbortException ex)
{
throw origEx;
}
}
}
Idealnie co naprawdę chciałbym to RecordException () metoda w IIS, jeśli coś takiego istnieje.
EnterpriseLoggingLibrary doskonale nadaje się do takich rzeczy - może rejestrować wyjątki w bazie danych, dzienniku zdarzeń systemu Windows, pliku tekstowym lub cokolwiek innego, co można wymyślić. –