Я написал приложение, которое корректно обрабатывает большинство исключений, с неповрежденным дизайном страницы и красивым сообщением об ошибке. Мое приложение перехватывает их все в событии Page_Error
и добавляет исключение к HttpContext.Curent.Context.Items
, а затем делает Server.Transfer
на странице Error.aspx
. Я считаю, что это единственное жизнеспособное решение в ASP.NET, так как, похоже, нет другого способа сделать это централизованным и общим способом.
Я также обрабатываю Application_Error
, и там я провожу некоторую проверку исключений, которые произошли, чтобы выяснить, могу ли я справиться с этим изящно или нет. Исключения, которые я нашел, я могу обработать изящно, такие, которые выдают после того, как кто-то взломал URI, чтобы содержать символы, которые .NET Framework считает опасными или просто недопустимыми на уровне файловой системы.
Такие URI могут выглядеть, например, как ::1010*
(обратите внимание на пробел перед косой чертой в конце последнего URI).
Мне бы хотелось, чтобы эти URI отвечали сообщением "404 Not Found" и дружеским сообщением, а также не вызывали отправку какого-либо отчета об ошибке, чтобы избежать векторов DDOS-атак и т.п. Однако я не нашел элегантного способа отловить ошибки такого типа. Теперь я проверяю свойство exception.TargetSite.Name
и, если оно равно CheckInvalidPathChars
, ValidatePath
или CheckSuspiciousPhysicalPath
, я считаю его "исключением проверки пути" и отвечаю 404.
Хотя это похоже на взлом. Во-первых, список имен методов, вероятно, не является полным, а во-вторых, существует вероятность того, что имена этих методов будут заменены или переименованы по линии, что приведет к разрыву моего кода.
У кого-нибудь есть идеи, как мне справиться с этим менее жестким и гораздо более перспективным способом?
PS: я использую System.Web.Routing
в своем приложении, чтобы иметь чистые и разумные URI, если это имеет какое-либо значение для любого конкретного решения.