Если бы у вас было требование регистрировать каждую полезную нагрузку запроса в вашем приложении, как бы вы это сделали? Я покажу, как мы можем использовать промежуточное программное обеспечение, чтобы раздавить эту жестянку.

Но сначала, что такое промежуточное ПО и зачем его использовать? Промежуточное ПО - это код, который запускается при каждом запросе вашего приложения. Это лучший способ проверить каждый запрос к вашему приложению. Если вам нужно выполнить фильтрацию запросов или проверить, аутентифицирован ли пользователь, вы можете определить свой собственный класс промежуточного программного обеспечения для его обработки и отклонения запросов до того, как остальная часть приложения их увидит.

Начиная

Для начала нам нужно определить класс. Если я уже просил слишком много, мы можем использовать сокращенный метод. Я проиллюстрировал это в конце - как только мы определим базовый класс, нам нужно будет определить минимальные требования. нам понадобится конструктор, который принимает делегат, и метод, обрабатывающий каждый вызов.

Нам нужно будет сохранить делегат из конструктора в поле, чтобы мы могли получить к нему доступ из метода Invoke. Это может быть частным и доступным только для чтения.

Другое требование класса Middleware - это метод обработки каждого вызова. Это делается путем предоставления общедоступного метода с именем Invoke, который принимает аргумент HttpContext. Я использовал async в своем примере, потому что обрабатывал асинхронный код.

Внедрение услуг

Если нам нужен доступ к каким-либо службам в классе промежуточного программного обеспечения, мы можем определить их двумя способами в зависимости от того, что нам нужно. Существует обычный метод запроса классов в конструкторе. Стоит отметить, что классы промежуточного программного обеспечения создаются только один раз за время выполнения, поэтому, если какие-либо внедренные службы требуют доступа к базе данных, соединения могут истекать.

Второй способ доступа к службам - это сам метод Invoke. Эти службы будут создаваться для каждого запроса, что устраняет проблему с истечением срока действия подключения к базе данных. Однако это означает, что если для создания службы требуется время, может быть лучше использовать традиционный метод внедрения службы.

Используя Invoke method

Мы можем получить большую часть необходимой нам информации о запросе из контекста, который мы получаем в этом методе Invoke. Он содержит всю информацию о запросе, такую ​​как файлы cookie, заголовки, строку запроса и многое другое.

Как только мы получаем тело запроса, оно предоставляется в виде необработанного потока. Эти действия выполняются до того, как они будут сериализованы из JSON и превращены в объекты.

Для обработки этого потока я не был уверен, нужно ли нам использовать usings для обработки входящего потока и его обработки. однако есть более простой способ обработки потока.

Используя класс StreamReader, мы можем легко прочитать его прямо в строке для обработки. Вызов метода ReadToEnd вернет все байты в потоке в виде строки. Затем у нас есть доступ к данным JSON, содержащимся в строке. Используя класс JSON Deserialiser, мы можем преобразовать его в известный нам тип объекта. Поймите, что, поскольку мы обрабатываем каждый запрос от каждой конечной точки, и до того, как они будут проверены, код должен будет уметь понимать, когда объекты искажены, и изящно экранировать.

Примеры

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

Убедитесь, что вы выполнили RequestDelegate последним, так как любой код, прежде чем он может быть выполнен, не может быть выполнен. Предположим, что при вызове делегата есть оператор возврата.

После настройки этого класса мы можем зарегистрировать его как промежуточное ПО в классе Startup нашего приложения.

Мы можем определить наше промежуточное программное обеспечение в форме UseMiddleware Или мы можем альтернативно использовать сокращенный метод.
Этот метод обеспечивает одновременно контекст и следующий вызов. Но сокращенный метод может затруднить обработку Factory Injection.

Последние мысли

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

Надеюсь, это поможет людям лучше использовать промежуточное ПО. Если вы хотите прочитать больше статей о C #, Я написал парочку. Если вы хотите ознакомиться с некоторыми проектами с открытым исходным кодом, я написал вы можете найти их здесь.