Компонент промежуточного программного обеспечения выполнен в порядке, и, как правило, имеет смысл использовать все компоненты в конвейере, пока один из них не решает разрезать конвейер, не вызывая следующий.
Это возможно, потому что каждый компонент промежуточного программного обеспечения имеет ссылку на следующий, а the environment - словарь объектов, чей ключ является строкой, который дает доступ ко всем необходимым вещам для проверки запроса, создания ответа, и многое другое. (использование словаря является умным, потому что легко добавить любую информацию или исполняемый код, который не известен заранее).
Каждый компонент может сделать следующие вещи, но все они не являются обязательными:
- выполнить код перед вызовом следующего компонента (обычно проверка и изменение словаря среды)
- вызова следующего промежуточного компонента трубопровод (который будет делать то же самое)
- выполнить некоторый код после того, как следующий компонент завершает выполнение
- сгенерирует исключение (намеренно или из-за уна необработанной ошибки)
Выполнение трубопровода завершится на одном из этих случаев:
- компонент промежуточного программного обеспечения не вызывает следующий
- компонент промежуточного программного обеспечения генерирует исключение
ПРИМЕЧАНИЕ: каждый «компонент промежуточного ПО» представляет собой реализацию Application Delegate
Имея ab unch компонентов имеет смысл, если они зарегистрированы в правильном порядке. Конвейер может выглядеть примерно так:
- аутентификации
- авторизации
- кэширование
- выполнение какой-то API или HTML поколения
Каждый компонент имеет достаточно информации для выполнения кода его ответственность. Например:
- Аутентификация будет выполнена, и укажите в описании слова директора. Затем будет указано следующее: компонент авторизации
- в зависимости от запроса и результата аутентификации, компонент авторизации будет решать, имеет ли у принципала разрешения для выполнения запроса и вызывает следующий компонент (кэширование) или отклонить запрос
- кэширование также может решить, может ли он вернуть результаты кэширования или должен вызвать следующий компонент
- последний компонент выполнит и, вероятно, создаст ответ, и он не будет вызывать никакой другой компонент. Стек вызовов будет выполняться в обратном порядке, предоставляя каждому компоненту возможность выполнять некоторую работу по эстрам. Например, компонент кэширования может кэшировать ответ, а следующие (авторизация и аутентификация) просто вернутся без выполнения какого-либо дополнительного кода.
Поскольку каждый компонент имеет весь запрос, отклик, контекст и любую другую желаемую информацию, у всех их есть достаточно информации, чтобы решить, нужно ли им что-то делать, модифицировать диктофон, calhehe next one или retunr ...
Таким образом, как вы можете видеть, регистрация большого количества компонентов промежуточного программного обеспечения не требует, чтобы все их выполнялись для каждого запроса, но иногда это имеет смысл.
OTOH, выполняющий компонент промежуточного программного обеспечения, может быть действительно дешевым. Например, аутентификация может просто выполнить следующий компонент, если запрос не требует авторизации. И то же самое с компонентом cahing, который может просто вызвать следующий компонент, если кэширование не требуется.
Таким образом, даже если компонент, находящийся в конвейере, может иметь дешевое исполнение, или он вообще может не запускаться в зависимости от запроса.
В вашем конкретном вопросе о статических файлах и веб-API один из компонентов будет перегруппирован перед другим. Первый, в зависимости от того, что будет, выполнит и создаст ответ, или просто вызовет следующий, в зависимости от запроса. Например. если статические файлы регистрируются перед другим, если файл запрашивается, статический файл будет создавать ответ и не будет вызывать веб-API. Если запрос не для файла, он ничего не сделает, кроме вызова следующего компонента: компонента веб-API.
Путь OWIN используется Katana - это один длинный конвейер промежуточного программного обеспечения, причем каждое промежуточное программное обеспечение изучает запрос и решает, обрабатывать его или передавать его следующему промежуточному программному обеспечению. Middleware также может передать его следующему промежуточному программному обеспечению в трубе и затем выполнить что-то еще. Это может быть неэффективным, если у вас много промежуточного программного обеспечения, и каждое промежуточное программное обеспечение должно знать, какие запросы обрабатывать. Существует также OWIN Framework NuGet, который решает эти проблемы. – bikeman868