Прочитав о промежуточном программном обеспечении asp.net core, я не понимаю, когда мне следует использовать фильтры, а когда - промежуточное программное обеспечение, поскольку они, похоже, достигают той же цели. Когда следует использовать промежуточное ПО вместо фитлеров?
asp.net-mvc
asp.net-core
Арванд
источник
источник
Ответы:
Об этом есть видео на канале 9: ASP.NET Monsters # 91: Middleware vs. Filters . Подведем итог видео:
Выполнение запроса начинается, и у нас есть промежуточное программное обеспечение и еще одно промежуточное программное обеспечение, представьте его как «русские куклы внутри кукол», и в конечном итоге срабатывает промежуточное программное обеспечение маршрутизации, а затем запрос переходит в конвейер MVC. Поэтому, если вам не нужен контекст MVC (скажем, вас беспокоит поток и выполнение, например, ответ на заголовки, какой-то механизм предварительной маршрутизации и т. Д.), Используйте промежуточное ПО .
Но если вам нужен контекст MVC, и вы хотите работать против действий, используйте фильтры .
источник
Промежуточное ПО работает на уровне ASP.NET Core и может реагировать на каждый запрос, поступающий в приложение.
С другой стороны, фильтры MVC запускаются только для запросов, поступающих в MVC.
Так, например, если бы я хотел обеспечить выполнение всех запросов через HTTPS, мне пришлось бы использовать для этого промежуточное ПО. Если бы я сделал фильтр MVC, который делал бы это, пользователи все равно могли бы запрашивать, например, статические файлы по HTTP.
Но с другой стороны, что-то, что регистрирует длительность запросов в контроллерах MVC, может абсолютно быть фильтром действий.
источник
Выполнение
middleware
происходит до того, как контекст MVC станет доступным в конвейере. То естьmiddleware
не имеет доступа кActionExecutingContext
или, например,ActionExecutedContext
в случае ActionFilter. У вас есть доступ к файлуHttpContext
, который позволит вам выполнять действия как с запросом, так и с ответом. Поскольку привязка модели еще не произошла, использование промежуточного программного обеспечения не подходит для запуска функции проверки или изменения значений.Middleware
также будет выполняться при каждом запросе, независимо от того, какой контроллер или действие вызывается.С другой стороны, он
filters
будет работать только с указанными действиями и контроллерами, если вы не зарегистрируете фильтр глобально при запуске. Поскольку у вас есть полный доступ к контексту, вы также можете получить доступ к контроллеру и самому действию.Источник и пример: dotnetcultist.com
источник