asp.net core middleware vs фильтры

86

Прочитав о промежуточном программном обеспечении asp.net core, я не понимаю, когда мне следует использовать фильтры, а когда - промежуточное программное обеспечение, поскольку они, похоже, достигают той же цели. Когда следует использовать промежуточное ПО вместо фитлеров?

Арванд
источник
1
Эта документация нацелена на этот конкретный вопрос. docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Nkosi

Ответы:

80

Об этом есть видео на канале 9: ASP.NET Monsters # 91: Middleware vs. Filters . Подведем итог видео:

Выполнение запроса начинается, и у нас есть промежуточное программное обеспечение и еще одно промежуточное программное обеспечение, представьте его как «русские куклы внутри кукол», и в конечном итоге срабатывает промежуточное программное обеспечение маршрутизации, а затем запрос переходит в конвейер MVC. введите описание изображения здесь Поэтому, если вам не нужен контекст MVC (скажем, вас беспокоит поток и выполнение, например, ответ на заголовки, какой-то механизм предварительной маршрутизации и т. Д.), Используйте промежуточное ПО .
Но если вам нужен контекст MVC, и вы хотите работать против действий, используйте фильтры .

Арванд
источник
Итак, если у меня есть логика, которую я хочу запускать при каждом запросе (например, ведение журнала), только некоторые из которых связаны с MVC, я бы поместил это в промежуточное программное обеспечение, затем обработчик фильтра выполнил любую конкретную логику, которая может потребоваться для него, затем перекинуть на промежуточное ПО?
Terry H
64

Промежуточное ПО работает на уровне ASP.NET Core и может реагировать на каждый запрос, поступающий в приложение.

С другой стороны, фильтры MVC запускаются только для запросов, поступающих в MVC.

Так, например, если бы я хотел обеспечить выполнение всех запросов через HTTPS, мне пришлось бы использовать для этого промежуточное ПО. Если бы я сделал фильтр MVC, который делал бы это, пользователи все равно могли бы запрашивать, например, статические файлы по HTTP.

Но с другой стороны, что-то, что регистрирует длительность запросов в контроллерах MVC, может абсолютно быть фильтром действий.

Juunas
источник
3

Выполнение middlewareпроисходит до того, как контекст MVC станет доступным в конвейере. То есть middlewareне имеет доступа к ActionExecutingContextили, например, ActionExecutedContextв случае ActionFilter. У вас есть доступ к файлу HttpContext, который позволит вам выполнять действия как с запросом, так и с ответом. Поскольку привязка модели еще не произошла, использование промежуточного программного обеспечения не подходит для запуска функции проверки или изменения значений. Middlewareтакже будет выполняться при каждом запросе, независимо от того, какой контроллер или действие вызывается.

С другой стороны, он filtersбудет работать только с указанными действиями и контроллерами, если вы не зарегистрируете фильтр глобально при запуске. Поскольку у вас есть полный доступ к контексту, вы также можете получить доступ к контроллеру и самому действию.

Источник и пример: dotnetcultist.com

Маджид Парвин
источник