ASP NET Core 5 — доступ (или передача) некоторого значения фильтру исключений

#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. Проверил, и это работает! Спасибо!