Вступительное слово от сообщества DotNet.Ru....23
Предисловие....25
Благодарности....27
Об этой книге ....29
Предисловие от издательства....22
Об авторе....34
Об иллюстрации на обложке....34
Начало работы с минимальными API....46
Начало работы с ASP.NET Core ....35
1.1 Что такое ASP.NET Core?....35
1.2 Какие типы приложений можно создавать?....36
1.3 Выбор ASP.NET Core ....37
1.4 Как работает ASP.NET Core? ....39
1.4.1 Как работает веб-запрос по протоколу HTTP? ....39
1.4.2 Как ASP.NET Core обрабатывает запрос? ....42
1.5 Что вы узнаете из этой книги ....43
Резюме....44
Часть I....46
Что такое ASP.NET Core....48
2.1 Использование фреймворка для создания веб-приложений....48
2.2 Для чего был создан ASP.NET Core....49
2.3 Парадигмы ASP.NET Core ....54
2.4 Когда следует выбрать ASP.NET Core....57
2.4.1 Если вы новичок в разработке .NET....58
2.4.2 Если вы .NET-разработчик, создающий новое приложение....60
2.4.3 Перенос существующего ASP.NET-приложения на ASP.NET Core....65
Резюме....67
Наше первое приложение....68
3.1 Краткий обзор приложения ASP.NET Core....69
3.2 Создаем наше первое приложение ASP.NET Core....71
3.2.1 Использование шаблона ....73
3.2.2 Сборка приложения....76
3.3 Запуск веб-приложения....77
3.4 Разбираемся с шаблоном проекта ....78
3.5 Файл проекта .csproj: объявление зависимостей....80
3.6 Файл Program.cs: определение приложения....82
3.7 Добавляем функциональность в приложение....85
3.7.1 Добавление и настройка сервисов ....88
3.7.2 Определение способа обработки запросов с помощью промежуточного ПО и конечных точек....90
Резюме....93
4....95
Обработка ошибок с помощью конвейера промежуточного ПО....95
4.1 Что такое промежуточное ПО....97
4.2 Объединение компонентов в конвейер....101
4.2.1 Простой сценарий конвейера 1: страница приветствия....102
4.2.2 Простой сценарий конвейера 2: обработка статических файлов ....105
4.2.3 Простой сценарий конвейера 3: приложение с минимальным API....109
4.3 Обработка ошибок с помощью промежуточного ПО....116
4.3.1 Просмотр исключений в окружении разработки: DeveloperExceptionPage....118
4.3.2 Обработка исключений в промышленном окружении: ExceptionHandlerMiddleware....120
Резюме....125
5....127
Создание JSON API с помощью минимальных API....127
5.1 Что такое HTTP API и когда его следует использовать?....128
5.2 Определение конечных точек минимальных API....132
5.2.1 Извлечение значений из URL-адреса с помощью маршрутизации....133
5.2.2 Сопоставление HTTP-методов с конечными точками....134
5.2.3 Определение обработчиков маршрутов с помощью функций....136
5.3 Генерация ответов с помощью IResult....139
5.3.1 Возврат кодов состояния с помощью Results и TypedResults....140
5.3.2 Возврат полезных данных об ошибках с помощью Problem Details....142
5.3.3 Преобразование всех ответов в Problem Details....144
Преобразование исключений в Problem Details....145
ПРЕОБРАЗОВАНИЕ КОДОВ СОСТОЯНИЯ ОШИБОК В ФОРМАТ PROBLEM DETAILS....147
5.4 Запуск общего кода с фильтрами конечных точек....149
5.4.1 Добавление нескольких фильтров к конечной точке....152
5.4.2 Фильтры или промежуточное ПО: что выбрать?....154
5.4.3 Обобщенные фильтры конечных точек....155
5.4.4 Реализация интерфейса IEndpointFilter....158
5.5 Организация API с помощью групп маршрутов....159
Резюме....162
6....164
Сопоставление URL-адресов с конечными точками с помощью маршрутизации....164
6.1 Что такое маршрутизация?....165
6.2 Маршрутизация конечных точек в ASP.NET Core....169
6.3 Изучение синтаксиса шаблона маршрута....173
6.3.1 Работа с параметрами и литеральными сегментами....173
6.3.2 Использование необязательных значений и значений по умолчанию....175
6.3.3 Добавление дополнительных ограничений к параметрам маршрута....176
6.3.4 Сопоставление произвольных URL-адресов с помощью универсального параметра....179
6.4 Генерация URL-адресов из параметров маршрута....180
6.4.1 Генерация URL-адресов для конечной точки минимального API с помощью класса LinkGenerator....181
6.4.2 Генерация URL-адресов с помощью IResults....183
6.4.3 Управление созданными URL-адресами с помощью RouteOptions....184
Резюме....186
7....188
Привязка модели и валидация в минимальных API....188
7.1 Извлечение значений из запроса с привязкой модели....189
7.2 Привязка простых типов к запросу....191
7.3 Привязка сложных типов к телу запроса в формате JSON....196
7.4 Массивы: простые типы или сложные?....198
7.5 Делаем параметры необязательными с помощью типов, допускающих значение NULL....201
7.6 Привязка сервисов и специальных типов....204
7.6.1 Внедрение хорошо известных типов....204
7.6.2 Внедрение сервисов....205
7.6.3 Привязка загрузки файлов с помощью IFormFile и IFormFileCollection....206
7.7 Собственная привязка с помощью BindAsync....208
7.8 Выбор источника привязки....209
7.9 Упрощение обработчиков с помощью AsParameters....210
7.10 Обработка пользовательского ввода с помощью валидации модели....212
7.10.1 Необходимость валидации модели....212
7.10.2 Использование атрибутов DataAnnotations для валидации....213
7.10.3 Добавление фильтра валидации в минимальные API....216
Резюме....219
Часть II....222
Создание полноценных приложений....222
8....224
Введение во внедрение зависимостей....224
8.1 Преимущества внедрения зависимостей....225
8.2 Создание слабосвязанного кода....232
8.3 Использование внедрения зависимостей в ASP.NET Core ....234
8.4 Добавление сервисов ASP.NET Core в контейнер....236
8.5 Использование сервисов из контейнера внедрения зависимостей....239
Резюме....241
9....243
Регистрация сервисов с помощью внедрения зависимостей....243
9.1 Регистрация собственных сервисов в контейнере внедрения зависимостей....244
9.2 Регистрация сервисов с использованием объектов и лямбда-функций....248
9.3 Многократная регистрация сервиса в контейнере....252
9.3.1 Внедрение нескольких реализаций интерфейса ....253
9.3.2 Внедрение одной реализации при регистрации нескольких сервисов ....255
9.3.3 Условная регистрация сервисов с помощью TryAdd....255
9.4 Жизненный цикл: когда создаются сервисы?....256
9.4.1 Transient: уникален каждый ....259
9.4.2 Scoped: держимся вместе....260
9.4.3 Singleton: может быть только один ....261
9.4.4 Следите за захваченными зависимостями ....263
9.5 Разрешение сервисов с жизненным циклом scoped за пределами запроса....266
Резюме....268
10....270
Конфигурирование приложения ASP. Net Core ....270
10.1 Представляем модель конфигурации ASP.NET Core....271
10.2 Создание объекта конфигурации для приложения....273
10.2.1 Добавление поставщика конфигурации в файле Program.cs ....276
10.2.2 Использование нескольких поставщиков для переопределения значений конфигурации....279
10.2.3 Безопасное хранение секретов конфигурации....281
Сохранение секретов в переменных окружения в промышленном окружении ....282
ХРАНЕНИЕ СЕКРЕТОВ С ПОМОЩЬЮ МЕНЕДЖЕРА USER SECRETS В ОКРУЖЕНИИ РАЗРАБОТКИ....283
10.2.4 Перезагрузка значений конфигурации при их изменении....285
10.3 Использование строго типизированных настроек с паттерном «Параметры»....287
10.3.1 Знакомство с интерфейсом IOptions....289
10.3.2 Перезагрузка строго типизированных параметров с помощью IOptionsSnapshot....290
10.3.3 Разработка классов параметров для автоматической привязки....292
10.3.4 Привязка строго типизированных параметров без интерфейса IOptions....294
10.4 Настройка приложения для нескольких окружений....296
10.4.1 Определение окружения размещения....297
10.4.2 Загрузка файлов конфигурации для конкретного окружения....298
10.4.3 Задаем окружение размещения....300
Резюме....304
11....307
Документирование API с помощью OpenAPI....307
11.1 Добавление описания OpenAPI в приложение....308
11.2 Тестирование API с помощью Swagger UI....311
11.3 Добавление метаданных в минимальные API....313
11.4 Создание строго типизированных клиентов с помощью NSwag ....316
11.4.1 Генерация клиента с помощью Visual Studio....317
11.4.2 Создание клиента с помощью инструмента .NET Global....321
11.4.3 Использование сгенерированного клиента для вызова API ....323
11.4.4 Настройка сгенерированного кода....324
11.4.5 Обновление описания OpenAPI ....327
11.5 Добавление описаний и сводок в конечные точки ....328
11.5.1 Использование текучих методов для добавления описаний....329
11.5.2 Использование атрибутов для добавления метаданных....331
11.6 Ограничения OpenAPI....335
11.6.1 Не все API можно описать, используя OpenAPI....335
11.6.2 Сгенерированный код чрезмерно категоричен....336
11.6.3 Инструменты часто отстают от спецификации....337
Резюме....338
12....341
Сохранение данных с Entity Framework Core....341
12.1 Знакомство с Entity Framework Core....343
12.1.1 Что такое EF Core?....343
12.1.2 Зачем использовать инструмент объектно-реляционного отображения?....345
12.1.3 Когда следует выбирать EF Core? ....346
12.1.4 Отображение базы данных в код приложения ....347
12.2 Добавляем EF Core в приложение....349
12.2.1 Выбор провайдера базы данных и установка EF Core....351
12.2.2 Создание модели данных ....352
12.2.3 Регистрация контекста данных ....355
12.3 Управление изменениями с помощью миграций....356
12.3.1 Создаем первую миграцию ....357
12.3.2 Добавляем вторую миграцию ....360
12.4 Выполнение запроса к базе данных и сохранение в ней данных ....363
12.4.1 Создание записи ....364
12.4.2 Загрузка списка записей....366
12.4.3 Загрузка отдельной записи ....368
12.4.4 Обновление модели с изменениями....370
12.5 Использование EF Core в промышленных приложениях....374
Резюме ....376
Часть III....378
Генерация HTML-кода с помощью Razor Pages и MVC....378
13....380
Создание сайта с помощью Razor Pages....380
13.1 Наше первое приложение Razor Pages....381
13.1.1 Использование шаблона «Веб-приложение»....381
13.1.2 Добавление и настройка сервисов....385
13.1.3 Создание HTML с помощью Razor Pages....387
13.1.4 Логика обработки запросов с помощью моделей страницы и обработчиков....389
13.2 Изучение типичной страницы Razor....391
13.3 Паттерн проектирования MVC....394
13.4 Применение паттерна проектирования MVC к Razor Pages....396
13.4.1 Направление запроса на страницу Razor и создание модели привязки....398
13.4.2 Выполнение обработчика с использованием модели приложения....400
13.4.3 Генерация HTML-кода с использованием модели представления....401
13.4.4 Собираем все вместе: полный запрос страницы Razor....402
Резюме....404
14....406
Сопоставление URL-адресов с Razor Pages с использованием маршрутизации....406
14.1 Маршрутизация в ASP.NET Core....407
14.2 Маршрутизация на основе соглашений и явная маршрутизация....408
14.3 Маршрутизация запросов в Razor Pages....411
14.4 Настройка шаблонов маршрутов страницы Razor....413
14.4.1 Добавление сегмента в шаблон маршрута....414
14.4.2 Полная замена шаблона маршрута....415
14.5 Генерация URL-адресов для страниц Razor....416
14.5.1 Генерация URL-адресов для страницы Razor....416
14.5.2 Генерация URL-адресов для контроллера MVC....417
14.5.3 Генерация URL-адресов с помощью класса LinkGenerator....419
14.6 Настройка соглашений с помощью Razor Pages....420
Резюме....426
15....428
Создание ответов с помощью обработчиков страниц в Razor Pages....428
15.1 Razor Pages и обработчики страниц....429
15.2 Выбор обработчика страницы для вызова....430
15.3 Прием параметров в обработчиках страниц....433
15.4 Возврат ответов IActionResult....435
15.4.1 PageResult и RedirectToPageResult....437
15.4.2 NotFoundResult и StatusCodeResult....437
15.5 Обработка кодов состояния с помощью StatusCodePagesMiddleware....439
Резюме....444
16....446
Привязка и валидация запросов с помощью Razor Pages....446
16.1 Модели в Razor Pages и MVC....447
16.2 От запроса к модели: делаем запрос полезным....450
16.2.1 Связывание простых типов ....455
16.2.2 Связывание сложных типов....458
Упрощение параметров метода привязкой к сложным объектам....459
Привязка коллекций и словарей....460
Привязка загрузки файлов с помощью IFormFile ....462
16.2.3 Выбор источника привязки ....462
16.3 Валидация моделей привязки....465
16.3.1 Валидация в Razor Pages....465
16.3.2 Валидация на сервере в целях безопасности....467
16.3.3 Валидация на стороне клиента для улучшения пользовательского опыта....471
16.4 Организация моделей привязки в Razor Pages....472
Резюме....475
17....477
Отрисовка HTML-кода с использованием представлений Razor....477
17.1 Представления: отрисовка пользовательского интерфейса....479
17.2 Создание представлений Razor....483
17.2.1 Представления Razor и сопутствующий код ....483
17.2.2 Знакомство с шаблонами Razor....484
17.2.3 Передача данных в представления....486
17.3 Создание динамических веб-страниц с помощью Razor....489
17.3.1 Использование кода C# в шаблонах Razor....490
17.3.2 Добавление циклов и условий в шаблоны Razor....491
17.3.3 Отрисовка HTML-кода с помощью метода Raw....494
17.4 Макеты, частичные представления и _ViewStart....496
17.4.1 Использование макетов для общей разметки ....497
17.4.2 Переопределение родительских макетов с помощью секций....500
17.4.3 Использование частичных представлений для инкапсуляции разметки....502
17.4.4 Выполнение кода в каждом представлении с помощью _ViewStart и _ViewImports....505
Импорт общих директив с помощью _ViewImports....505
Выполнение кода для каждого представления с помощью _ViewStart ....506
Резюме....507
18....509
Создание форм с помощью тег-хелперов....509
18.1 Редакторы кода и тег-хелперы....511
18.2 Создание форм с помощью тег-хелперов ....514
18.2.1 Тег-хелпер формы ....519
18.2.2 Тег-хелпер метки....520
18.2.3 Тег-хелперы текстового ввода....522
18.2.4 Тег-хелпер раскрывающегося списка....526
18.2.5 Тег-хелперы сообщений валидации и сводок валидации....532
18.3 Создание ссылок с помощью тег-хелпера привязки ссылки ....535
18.4 Сброс кеша с помощью тег-хелпера добавления версии ....536
18.5 Использование условной разметки с помощью тег-хелпера окружения....538
Резюме....539
19....542
Создание сайта с использованием контроллеров MVC....542
19.1 Razor Pages и MVC в ASP.NET Core....543
19.2 Наше первое веб-приложение MVC ....544
19.3 Сравнение контроллера MVC с PageModel из Razor Page....548
19.4 Выбор представления из контроллера MVC....550
19.5 Выбор между Razor Pages и контроллерами MVC....557
19.5.1 Преимущества Razor Page....557
19.5.2 Когда выбирать контроллеры MVC вместо Razor Pages....560
Резюме....562
20....563
Создание HTTP API с использованием контроллеров веб-API....563
20.1 Создание первого проекта веб-API....564
20.2 Применение паттерна проектирования MVC к веб-API....571
20.3 Маршрутизация на основе атрибутов: связывание методов действий с URL-адресами....575
20.3.1 Сочетание атрибутов маршрута для следования принципу DRY....577
20.3.2 Использование замены маркера для уменьшения дублирования при маршрутизации на основе атрибутов....579
20.3.3 Обработка HTTP-методов с помощью маршрутизации на основе атрибутов....580
20.4 Использование общепринятых соглашений с атрибутом [ApiController]....581
20.5 Генерация ответа от модели....584
20.5.1 Настройка форматеров по умолчанию: добавляем поддержку XML....587
20.5.2 Выбор формата ответа с помощью согласования типа содержимого....588
20.6 Контроллеры веб-API и минимальные API: что выбрать?....590
Резюме....593
21....596
Конвейер фильтров MVC и Razor Pages....596
21.1 Что такое конвейер фильтров MVC....597
21.2 Конвейер фильтров Razor Pages....600
21.3 Фильтры или промежуточное ПО: что выбрать?....602
21.4 Создание простого фильтра....603
21.5 Добавляем фильтры к действиям и страницам Razor Pages....606
21.6 Порядок выполнения фильтров....609
21.6.1 Порядок выполнения фильтров по умолчанию....609
21.6.2 Переопределение порядка выполнения фильтров по умолчанию с помощью интерфейса IOrderedFilter....610
Резюме....611
22....613
Создание собственных фильтров MVC и страниц Razor ....613
22.1 Создание собственных фильтров для приложения....614
22.1.1 Фильтры авторизации: защита API....617
22.1.2 Фильтры ресурсов: прерывание выполнения методов действий....618
22.1.3 Фильтры действий: настройка привязки модели и результатов действий....620
22.1.4 Фильтры исключений: собственная обработка исключений для методов действий....626
22.1.5 Фильтры результатов: настройка результатов действий перед их выполнением....628
22.1.6 Фильтры страниц: настройка привязки модели для Razor Pages....630
22.2 Прерывание выполнения конвейера....632
22.3 Использование внедрения зависимостей с атрибутами фильтра....635
Резюме....638
Часть IV....640
Защита и развертывание приложений....640
23....642
Аутентификация: добавление пользователей в приложение с помощью ASP.NET Core Identity....642
23.1 Знакомство с аутентификацией и авторизацией....644
23.1.1 Пользователи и утверждения в ASP.NET Core....644
23.1.2 Аутентификация в ASP.NET Core: сервисы и промежуточное ПО....645
Вход в приложение ASP.NET Core....646
Аутентификация пользователей для последующих запросов....647
23.2 Что такое ASP.NET Core Identity?....650
23.3 Создание проекта, в котором используется ASP.NET Core Identity....653
23.3.1 Создание проекта из шаблона....653
23.3.2 Изучение шаблона в Обозревателе решений ....655
23.3.3 Модель данных ASP.NET Core Identity....659
23.3.4 Взаимодействие с ASP.NET Core Identity ....661
23.4 Добавляем ASP.NET Core Identity в существующий проект....664
23.4.1 Настройка сервисов ASP.NET Core Identity и промежуточного ПО....665
23.4.2 Обновление модели данных EF Core для поддержки Identity....666
23.4.3 Обновление представлений Razor для связи с пользовательским интерфейсом Identity ....667
23.5 Настройка страницы по умолчанию в пользовательском интерфейсе ASP.NET Core Identity....669
23.6 Управление пользователями: добавление специальных данных для пользователей ....673
Резюме....675
24....678
Авторизация: обеспечиваем защиту приложения ....678
24.1 Знакомство с авторизацией....680
24.2 Авторизация в ASP.NET Core ....683
24.2.1 Предотвращение доступа анонимных пользователей к приложению....684
24.2.2 Обработка запросов, не прошедших аутентификацию....686
24.3 Использование политик для авторизации на основе утверждений....690
24.4 Создание пользовательских политик авторизации....693
24.4.1 Требования и обработчики: строительные блоки политики....694
24.4.2 Создание политики со специальным требованием и обработчиком....695
Создание IAuthorizationRequirement для представления требования ....695
Создание политики с несколькими требованиями....696
Создаем обработчики авторизации, чтобы отвечать требованиям....697
24.5 Управление доступом с авторизацией на основе ресурсов....701
24.5.1 Ручная авторизация запросов с помощью IAuthorizationService....703
24.5.2 Создание обработчика AuthorizationHandler на основе ресурсов....706
24.6 Скрытие HTML-элементов от неавторизованных пользователей....709
Резюме....712
25....714
Аутентификация и авторизация для API ....714
25.1 Аутентификация для API и распределенных приложений ....715
25.1.1 Распространение аутентификации на несколько приложений....715
25.1.2 Централизация аутентификации в поставщике идентификационной информации ....717
25.1.3 OpenID Connect и OAuth 2.0....720
25.2 Аутентификация с токеном на предъявителя....723
25.3 Добавление аутентификации на основе JWT-токенов на предъявителя в минимальные API ....730
25.4 Использование инструмента user-jwts для локального тестирования JWT-токенов....732
25.4.1 Создание JWT-токенов с помощью инструмента user-jwts....733
25.4.2 Настройка JWT-токенов....735
25.4.3 Управление локальными JWT....736
25.5 Описание требований к аутентификации для OpenAPI ....737
25.6 Применение политик авторизации к конечным точкам минимальных API ....741
Резюме....745
26....748
Мониторинг и устранение ошибок с помощью журналирования ....748
26.1 Эффективное использование журналирования в промышленном приложении....750
26.1.1 Выявление проблем с помощью специальных сообщений журнала....751
26.1.2 Абстракции журналирования ASP.NET Core ....753
26.2 Добавление сообщений журнала в ваше приложение....754
26.2.1 Уровень сообщения журнала: насколько важно сообщение журнала?....758
26.2.3 Форматирование сообщений и сбор значений параметров....761
26.2.2 Категория журнала: какой компонент создал журнал?....760
26.3 Контроль места записи журналов с помощью поставщиков журналирования....763
26.4 Изменение избыточности сообщений журналов с помощью фильтрации....767
26.5 Структурное журналирование: создание полезных сообщений журналов с возможностью поиска ....772
26.5.1 Добавление поставщика структурного журналирования в приложение ....774
26.5.2 Использование областей журналирования для добавления дополнительных свойств в сообщения журнала....777
Резюме....779
27....781
Публикация и развертывание приложения ....781
27.1 Что такое модель хостинга ASP.NET Core....782
27.1.1 Запуск и публикация приложения ASP.NET Core....785
27.1.2 Выбор метода развертывания для приложения....789
27.2 Публикация приложения в IIS....791
27.2.1 Конфигурирование IIS для ASP.NET Core....791
27.2.2 Подготовка и публикация приложения в IIS....793
27.3 Размещение приложения в Linux....796
27.3.1 Запуск приложения ASP.NET Core за обратным прокси-сервером в Linux ....796
27.3.2 Подготовка приложения к развертыванию в Linux....799
27.4 Настройка URL-адресов приложения ....801
Резюме....805
28....806
Добавляем протокол HTTPS в приложение....806
28.1 Для чего нужен протокол HTTPS?....807
28.2 Использование HTTPS-сертификатов для разработки....811
28.3 Настройка Kestrel для использования сертификата HTTPS в промышленном окружении ....814
28.4 Делаем так, чтобы протокол HTTPS использовался для всего приложения....816
28.4.1 Принудительное использование протокола HTTPS с помощью заголовков HTTP Strict Transport Security....817
28.4.2 Переадресация с HTTP на HTTPS с помощью компонента HttpsRedirectionMiddleware....821
28.4.3 Отклонение HTTP-запросов в приложениях API....824
Резюме....825
29....827
Повышаем безопасность приложения ....827
29.1 Защита от межсайтового скриптинга....828
29.2 Защита от межсайтовой подделки запросов (CSRF) ....832
29.3 Вызов веб-API из других доменов с помощью CORS....838
29.3.1 Что такое CORS и как он работает ....839
29.3.2 Добавление глобальной политики CORS ко всему приложению....841
29.3.3 Добавление CORS к определенным конечным точкам с помощью метаданных EnableCors....843
29.3.4 Настройка политик CORS....845
29.4 Изучение других векторов атак....847
29.4.1 Обнаружение и предотвращение атак с открытым перенаправлением ....847
29.4.2 Предотвращение атак с использованием внедрения SQL-кода с помощью EF Core и параметризации ....849
29.4.3 Предотвращение небезопасных прямых ссылок на объекты....851
29.4.4 Защита паролей и данных пользователей....852
Резюме....854
Часть V....856
Дальнейшая работа с ASP.NET Core....856
30....858
Создание приложений ASP.NET Core с помощью обобщенного хоста и класса Startup....858
30.1 Разделение ответственностей между двумя файлами....859
30.2 Класс Program: сборка веб-хоста....860
30.3 Класс Startup: настройка приложения....862
30.4 Создание собственного экземпляра IHostBuilder....867
30.5 Сложность обобщенного хоста ....870
30.6 Выбор между обобщенным хостом и минимальным хостингом....873
Резюме ....875
31....878
Расширенная настройка ASP.NET Core....878
31.1 Настройка конвейера промежуточного ПО....879
31.1.1 Создание простых приложений с помощью метода расширения Run ....880
31.1.2 Ветвление конвейера с помощью метода расширения Map....882
31.1.3 Добавление в конвейер с помощью метода расширения Use....886
31.1.4 Создание пользовательского компонента промежуточного программного обеспечения....889
31.1.5 Преобразование промежуточного ПО в конечные точки....893
31.2 Использование внедрения зависимостей с OptionsBuilder и IConfigureOptions ....897
31.3 Использование стороннего контейнера внедрения зависимостей....903
Резюме....906
32....908
Создание собственных компонентов MVC и Razor Pages....908
32.1 Создание собственного тег-хелпера Razor....909
32.1.1 Вывод информации об окружении с помощью собственного тег-хелпера....910
32.1.2 Создание специального тег-хелпера для условного скрытия элементов....914
32.1.3 Создание тег-хелпера для преобразования Markdown в HTML....916
32.2 Компоненты представления: добавление логики в частичные представления....918
32.3 Создание собственного атрибута валидации....924
32.4 Замена фреймворка валидации на FluentValidation....929
32.4.1 Сравнение FluentValidation и атрибутов DataAnnotations....930
32.4.2 Добавляем FluentValidation в приложение....934
Резюме....935
33....938
Вызов удаленных API с помощью IHttpClientFactory....938
33.1 Вызов API по протоколу HTTP: проблема с классом HttpClient ....939
33.2 Создание экземпляров класса HttpClient с помощью интерфейса IHttpClientFactory....945
33.2.1 Использование IHttpClientFactory для управления жизненным циклом HttpClientHandler....945
33.2.2 Настройка именованных клиентов во время регистрации....949
33.2.3 Использование типизированных клиентов для инкапсуляции HTTP-вызовов....950
33.3 Обработка временных ошибок HTTP с помощью библиотеки Polly....953
33.4 Создание специального обработчика HttpMessageHandler....956
Резюме....959
34....961
Создание фоновых задач и сервисов....961
34.1 Запуск фоновых задач с помощью IHostedService....962
34.1.1 Запуск фоновых задач по таймеру ....963
34.1.2 Использование сервисов с жизненным циклом Scoped в фоновых задачах ....968
34.2 Создание сервисов рабочей роли без пользовательского интерфейса с использованием IHost....970
34.2.1 Создание сервиса рабочей роли из шаблона....972
34.2.2 Запуск сервисов рабочей роли в промышленном окружении....975
34.3 Координация фоновых задач с помощью Quartz.NET....978
34.3.1 Установка Quartz.NET в приложение ASP.NET Core....979
34.3.2 Настройка задания для запуска по расписанию с помощью Quartz.NET....981
34.3.3 Использование кластеризации для повышения избыточности фоновых задач....984
Резюме....988
35....990
Тестирование приложений с помощью xUnit....990
35.1 Тестирование в ASP.NET Core....991
35.2 Создание первого тестового проекта с xUnit....993
35.3 Запуск тестов командой dotnet test....996
35.4 Ссылка на ваше приложение из тестового проекта ....997
35.5 Добавление модульных тестов с атрибутами Fact и Theory....1000
35.6 Тестирование условий сбоя....1004
Резюме....1005
36....1007
Тестирование приложений ASP.NET Core....1007
36.1 Модульное тестирование пользовательского промежуточного ПО....1008
36.2 Модульное тестирование контроллеров API и конечных точек минимальных API....1011
36.3 Интеграционное тестирование: тестирование всего приложения в памяти....1016
36.3.1 Создание TestServer с помощью пакета Test Host....1017
36.3.2 Тестирование приложения с помощью WebApplicationFactory ....1020
36.3.3 Замена зависимостей в классе WebApplicationFactory ....1023
36.3.4 Уменьшение дублирования кода за счет создания своего класса WebApplicationFactory....1025
36.4 Изоляция базы данных с помощью поставщика EF Core в памяти....1027
Резюме....1032
Приложение А. Подготовка окружения разработки....1034
А.1 Установка .NET SDK ....1035
А.2 Выбор интегрированной среды разработки или редактора кода....1036
А.2.1 Visual Studio (Windows)....1037
А.2.2 Rider от компании JetBrains (Windows, Linux, macOS)....1038
А.2.3 Visual Studio для Mac (macOS)....1039
А.2.4 Visual Studio Code (Windows, Linux, macOS)....1039
Приложение Б. Полезные ссылки....1041
Б.1 Список литературы....1041
Б.2 Анонсы в блогах....1042
Б.3 Документация Microsoft ....1043
Б.4 Ссылки по темам, связанным с безопасностью....1043
Б.5 Репозитории ASP.NET Core на GitHub....1044
Б.6 Инструменты и сервисы ....1044
Б.7 Блоги ASP.NET Core....1044
Б.8 Ссылки на видео....1045
Фреймворк ASP.NET Core предоставляет все необходимое для создания веб-приложений профессионального качества. Благодаря повышающим производительность библиотекам для отрисовки на стороне сервера, безопасным API, простому доступу к данным и многому другому вы потратите свое время на реализацию функциональных возможностей, а не на исследование синтаксиса и отслеживание ошибок. Эта книга — ваш путеводитель.В третьем издании показано, как создавать веб-приложения для эксплуатации в промышленном окружении с помощью ASP.NET Core 7.0. Вы будете учиться на практических примерах, содержательных иллюстрациях и коде с подробными пояснениями. В числе новинок: создание минимальных API, обеспечение безопасности API с помощью токенов на предъявителя, WebApplicationBuilder и многое другое.
Книга предназначена для разработчиков среднего уровня. Примеры написаны на C#.
Издание выпущено при поддержке сообщества .NET разработчиков DotNet.Ru.