#c# #asp.net-core #exception #exceptionfilterattribute
Вопрос:
В C# .NET Core в веб-приложении ASP NET 5 Core у нас есть пользовательский фильтр исключений:
public class CustomExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
...
Который добавляется в базовый контроллер:
[TypeFilter(typeof(CustomExceptionFilter))]
public class MyBaseController : Controller
{
В контроллере, использующем имя входа пользователя, мы считываем некоторые свойства пользователя из таблицы SQL и устанавливаем некоторые ключевые свойства для данных сеанса — на данный момент самое важное, является ли он/она «веб-разработчиком» или нет. Когда происходит исключение, фильтр исключений улавливает это, но отображаемое сообщение об ошибке должно сильно отличаться (подробно), если у пользователя есть эта роль или нет.
Моя проблема заключается в следующем: как получить доступ к экземпляру сеанса из фильтра исключений или лучше: как установить (передать) это логическое значение в фильтр исключений?
Заранее благодарю за ваши предложения!
Комментарии:
1. Подумайте о добавлении собственных пользовательских исключений с параметрами, которые вам действительно нужны. Я считаю, что это лучший подход, чем работа с сессией, как предлагается ниже
2. Мне нужно знать, является ли текущий пользователь разработчиком или нет. Исключения иногда возникают на любом уровне . ЧИСТЫЕ исключения (исключения с нулевой ссылкой и так далее). Я не хочу писать уловы попыток, и в нескольких слоях это свойство пользователя трудно получить доступ.
Ответ №1:
Ключом к обмену информацией является доступ OnExceptions
к параметру » s ExceptionContext
» и детализация ваших элементов в сеансе.
Вот context
… HttpContext
Items
где HttpContext
находится тип HttpContext
и Items
является IDictionary<object, object>
.
Конечно, параметры сеанса должны быть сохранены в сеансе до возникновения исключения. Вы могли бы сделать это по-другому, что может быть привлекательным или нет для вас: поймать исключение и создать на его месте пользовательское, которое обладает boolean
свойством для сохранения вашей ценности. Затем вы можете получить доступ к свойству этого исключения в фильтре через context
. Exception
после приведения к вашему пользовательскому типу исключения.
Комментарии:
1. Поймать и переосмыслить — это не вариант. Мы бы не хотели записывать блок try-catch во все методы контроллера. В этом случае фильтр общих исключений не понадобится.
2. Я проверю доступ к сеансу через HttpContext, который вы предложили. Спасибо!
3. Проверил, и это работает! Спасибо!