Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

ASP.Net Core в действии

Покупка
Новинка
Артикул: 799581.02.99
Доступ онлайн
2 049 ₽
В корзину
Эта книга знакомит читателей с основами фреймворка ASP.NET Core, такими как промежуточное ПО, внедрение зависимостей и конфигурация. Автор показывает, как настроить их в соответствии с пользовательскими требованиями. Речь пойдет о том, как добавить аутентификацию и авторизацию в свои приложения, как повысить их безопасность, а также как развертывать их и осуществлять мониторинг. Рассматривается тестирование приложений с использованием модульных и интеграционных тестов. Основное внимание будет уделено тому, как создавать приложения с отрисовкой на стороне сервера, используя страницы Razor и веб-API, а также контроллеры MVC. Книга подойдет как тем, кто является новичком в веб-разработке, так и тем, кто уже имеет опыт использования фреймворка ASP.NET.
Лок, Э. ASP.Net Core в действии : практическое руководство / Э. Лок ; пер. с анг. Д. А. Беликова. - Москва : ДМК Пресс, 2021. - 906 с. - ISBN 978-5-97060-550-9. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2155886 (дата обращения: 18.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Эндрю Лок

ASP.Net Core в действии
ASP.NET Core in Action

SECOND EDITION

ANDREW LOCK
ASP.Net Core в действии

ЭНДРЮ ЛОК

Москва, 2021
УДК 004.438.NET
ББК 32.973.26-018.2
Л73

Лок Э.
Л73 
ASP.Net Core в действии / пер. с анг. Д. А. Беликова. – М.: ДМК Пресс, 2021. – 
906 с.: ил. 

ISBN 978-5-97060-550-9

Эта книга знакомит читателей с основами фреймворка ASP.NET Core, такими как 
промежуточное ПО, внедрение зависимостей и конфигурация. Автор показывает, как 
настроить их в соответствии с пользовательскими требованиями. Речь пойдет о том, 
как добавить аутентификацию и авторизацию в свои приложения, как повысить их 
безопасность, а также как развертывать их и осуществлять мониторинг. Рассматривается 
тестирование приложений с использованием модульных и интеграционных 
тестов.
Основное внимание будет уделено тому, как создавать приложения с отрисовкой 
на стороне сервера, используя страницы Razor и веб-API, а также контроллеры MVC.
Книга подойдет как тем, кто является новичком в веб-разработке, так и тем, кто 
уже имеет опыт использования фреймворка ASP.NET.

УДК 004.438.NET
ББК 32.973.26-018.2

Original English language edition published by Manning Publications USA, USA. Russian-language 
edition copyright © 2021 by DMK Press. All rights reserved.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой 
бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев 
авторских прав.

ISBN 978-1-6172-9830-1 (англ.) 
© Manning Publications, 2021
ISBN 978-5-97060-550-9 (рус.) 
© Перевод, оформление, издание, ДМК Пресс, 2021
Оглавление

 Часть I  НАЧАЛО РАБОТЫ С ASP.NET CORE ....................................................... 31
 
1  Начало работы с ASP.NET Core ...................................................................... 33

 
2  Ваше первое приложение .............................................................................. 58

 
3  Обработка запросов с по мощью конвейера промежуточного ПО ....... 95

 
4  Создание веб-сайта с помощью страниц Razor ...................................... 130

 
5  Сопоставление URL-адресов с Razor Pages с использованием  

 
     маршрутизации  ............................................................................................. 164

 
6  Модель привязки: получение и проверка пользовательского ввода .... 203

 
7  Визуализация HTML-кода с использованием представлений Razor .... 239

 
8  Создание форм с помощью тег-хелперов ................................................ 278

 
9  Создание веб-API для мобильных и клиентских приложений   

 
     с по мощью MVC ............................................................................................. 313

 Часть II  СОЗДАНИЕ ПОЛНОЦЕННЫХ ПРИЛОЖЕНИЙ ................................ 350
 
10  Конфигурация сервисов с по мощью внедрения зависимостей ......... 352

 
11  Конфигурирование приложения ASP.NETCore ....................................... 394

 
12  Cохраняем данные с Entity Framework Core  ........................................... 432

 
13  Конвейер фильтров MVC и Razor Pages  ................................................... 471

 
14  Аутентификация: добавляем пользователей в приложение   

 
     с по мощью ASP.NET Core Identity  ............................................................. 513

 
15  Авторизация: обеспечиваем защиту приложения  ............................... 553

 
16  Публикация и развертывание приложения  ............................................ 590

 Часть III  РАСШИРЕНИЕ ПРИЛОЖЕНИЙ .............................................................. 628
 
17  Мониторинг и устранение ошибок с помощью журналирования  .... 630

 
18  Повышаем безопасность приложения  ..................................................... 667

 
19  Создание специальных компонентов  ...................................................... 710

 
20  Создание специальных компонентов MVC и Razor Pages  .................. 745

 
21  Вызов удаленных API с помощью IHttpClientFactory  .......................... 775

 
22  Создание фоновых задач и сервисов ........................................................ 799

 
23  Тестирование приложения .......................................................................... 827
Содержание

Предисловие .......................................................................................................... 19
Благодарности ....................................................................................................... 21
Об этой книге ........................................................................................................ 23
Об авторе ................................................................................................................ 29
Об иллюстрации на обложке ............................................................................. 30

Часть I 
НАЧАЛО РАБОТЫ С ASP.NET CORE ..................... 31

1 

Начало работы с ASP.NET Core .................................................... 33

1.1 
Введение в ASP.NET Core ......................................................................... 34
1.1.1Использованиевеб-фреймворка ........................................................ 35
1.1.2ЧтотакоеASP.NETCore? ................................................................. 37

1.2 
Когда следует отдать предпочтение ASP.NET Core ............................ 40
1.2.1Какиетипыприложенийможносоздавать? ................................... 40
1.2.2Есливыновичокв разработкена.NET ............................................. 43
1.2.3Есливыразработчик,создающийновоеприложение...................... 45
1.2.4ПереноссуществующегоASP.NET-приложениянаASP.NETCore ..... 50

1.3 
Как работает ASP.NET Core? .................................................................... 51
1.3.1Какработаетвеб-запроспопротоколуHTTP? .............................. 52
1.3.2КакASP.NETCoreобрабатываетзапрос? ....................................... 54

1.4 
Что вы узнаете из этой книги ................................................................ 56

Резюме .................................................................................................................... 57

2 

Ваше первое приложение .................................................................... 58

2.1 
Краткий обзор приложения ASP.NET Core .......................................... 60

2.2 
Создание вашего первого приложения ASP.NET Core ...................... 62
2.2.1Использованиешаблона .................................................................... 63
2.2.2Сборкаприложения ........................................................................... 66

2.3 
Запуск веб-приложения........................................................................... 68

2.4 
Разбираемся с макетом проекта ........................................................... 70
Содержание

2.5 
Файл проекта .csproj: определение зависимостей ............................ 71

2.6 
Класс Program: сборка веб-хоста ........................................................... 74

2.7 
Класс Startup: настройка вашего приложения ................................... 77
2.7.1Добавлениеи настройкасервисов .................................................... 79
2.7.2Определяем,какобрабатываютсязапросыс помощьюпромежуточногопрограммногообеспечения ................................... 81

2.8 
Создание ответов с по мощью Razor Pages .......................................... 86
2.8.1СозданиеHTMLс помощьюстраницRazor ...................................... 87
2.8.2Логикаобработкизапросовс помощьюPageModelsи обработчиков ................................................................................. 89

Резюме .................................................................................................................... 93

3 

Обработка запросов с по мощью конвейера  

 
промежуточного ПО .............................................................................. 95
3.1 
Что такое промежуточное ПО? .............................................................. 97

3.2 
Объединение компонентов в конвейер ............................................ 102
3.2.1Простойсценарийконвейера1:страница приветствия ..................102
3.2.2Простойсценарийконвейера2:обработка статическихфайлов ... 106
3.2.3Простойсценарийконвейера3:приложениесо страницамиRazor ......................................................................................................110

3.3 
Обработка ошибок с по мощью промежуточного ПО ..................... 116
3.3.1Просмотрисключенийв окруженииразработки:DeveloperExceptionPage .................................................................... 118
3.3.2Обработкаисключенийв промышленномокружении:ExceptionHandlerMiddleware ............................................................ 119
3.3.3Обработкадругихошибок:StatusCodePagesMiddleware ................ 124

3.3.4 Компонент обработки ошибок и веб-API .......................................... 128
Резюме .................................................................................................................. 129

4 

Создание веб-сайта с помощью страниц Razor ........... 130
4.1 
Введение в Razor Pages .......................................................................... 132
4.1.1ИзучениетипичнойстраницыRazor .............................................. 132
4.1.2ПаттернпроектированияMVC ..................................................... 134
4.1.3ПрименениепаттернапроектированияMVCк Razor Pages ........ 137
4.1.4ДобавлениеRazorPagesв приложение ............................................ 145

4.2 
Сравнение Razor Pages и MVC в ASP.NET Core ................................. 149
4.2.1КонтроллерыMVCв ASP.NETCore ................................................. 149
4.2.2ПреимуществаRazorPages ............................................................. 151
4.2.3КогдавыбиратьконтроллерыMVCвместоRazorPages ............... 154

4.3 
Razor Pages и обработчики страниц ................................................... 155
4.3.1Приемпараметровв обработчикахстраниц ................................ 157
4.3.2Возвратответовс помощьюActionResults.................................... 159

Резюме .................................................................................................................. 163

5 

Сопоставление URL-адресов с Razor Pages   

 
с использованием маршрутизации  ......................................... 164
5.1 
Что такое маршрутизация? ................................................................... 165

5.2 
Маршрутизация в ASP.NET Core .......................................................... 169
Содержание

5.2.1Использованиемаршрутизацииконечныхточекв ASP.NETCore .... 169
5.2.2Маршрутизациянаосновесоглашенийи маршрутизациянаосновеатрибутов ...................................................................... 173
5.2.3Маршрутизацияи страницыRazor ................................................ 176

5.3 
Настройка шаблонов маршрутов для страницы Razor .................. 178
5.3.1Добавлениесегментав шаблонмаршрута .................................... 180
5.3.2ПолнаязаменашаблонамаршрутастраницыRazor .................... 181

5.4 
Изучение синтаксиса шаблона маршрута ......................................... 182
5.4.1Использованиедополнительныхзначенийи значенийпоумолчанию .................................................................................. 182
5.4.2Добавлениедополнительныхограниченийк параметраммаршрута ....................................................................................... 184
5.4.3СопоставлениепроизвольныхURL-адресовс помощьюуниверсальногопараметра ............................................................. 186

5.5 
Генерация URL-адресов из параметров маршрута ......................... 188
5.5.1СозданиеURL-адресовдлястраницыRazor ................................... 189
5.5.2СозданиеURL-адресовдляконтроллераMVC ................................ 190
5.5.3СозданиеURL-адресовс помощьюActionResults ............................. 192
5.5.4СозданиеURL-адресовиздругихчастейвашего приложения ........ 193

5.6 
Выбор обработчика страницы для вызова ........................................ 194

5.7 
Настройка соглашений с помощью Razor Pages .............................. 197

Резюме .................................................................................................................. 201

6 

Модель привязки: получение и проверка  

 
пользовательского ввода  ................................................................. 203
6.1 
Модели в Razor Pages и MVC ................................................................. 204

6.2 
От запроса к модели: делаем запрос полезным .............................. 208
6.2.1Связываниепростыхтипов ............................................................ 212
6.2.2Привязкасложныхтипов ................................................................ 216
6.2.3Выбористочникапривязки ............................................................. 221

6.3 
Обработка пользовательского ввода с помощью  

 
валидации модели .................................................................................. 223
6.3.1Необходимостьвалидациимодели ................................................. 223
6.3.2ИспользованиеатрибутовDataAnnotationsдля валидации .......... 225
6.3.3Валидациямоделинасерверев целяхбезопасности ...................... 228
6.3.4Валидациянасторонеклиентадля улучшенияпользовательскогоинтерфейса ...................................................... 232

6.4 
Организация моделей привязки в Razor Pages ................................ 234

Резюме .................................................................................................................. 237

7 

Визуализация HTML-кода с использованием  

 
представлений Razor  .......................................................................... 239
7.1 
Представления: визуализация пользовательского интерфейса ..... 241

7.2 
Создание представлений Razor ........................................................... 245
7.2.1ПредставленияRazorи сопутствующийкод ................................. 245
7.2.2Знакомствос шаблонамиRazor ..................................................... 247
7.2.3Передачаданныхв представления ................................................. 248

7.3 
Создание динамических веб-страниц с помощью Razor .............. 251
7.3.1ИспользованиеC#в шаблонахRazor ............................................... 252
Содержание

7.3.2Добавлениециклови условийв шаблоныRazor .............................. 253
7.3.3ВизуализацияHTMLс помощьюметодаRaw ................................. 256

7.4 
Макеты, частичные представления и _ViewStart ............................ 259
7.4.1Использованиемакетовдляобщейразметки ................................ 260
7.4.2Переопределениеродительскихмакетовс помощью секций ......... 262
7.4.3Использованиечастичныхпредставленийдля инкапсуляцииразметки ......................................................................................... 264
7.4.4Выполнениекодав каждомпредставлениис помощью_ViewStartи _ViewImports............................................................... 267

7.5 
Выбор представления из контроллера MVC ..................................... 270

Резюме .................................................................................................................. 276

8 

Создание форм с помощью тег-хелперов ........................... 278
8.1 
Редакторы кода и тег-хелперы ............................................................. 280

8.2 
Создание форм с по мощью тег-хелперов ......................................... 283
8.2.1Тег-хелперформы ............................................................................ 288
8.2.2Тег-хелперметки(label) ................................................................. 291
8.2.3Тег-хелперыввода(input)и областитекста(textarea) ................. 292
8.2.4Тег-хелперраскрывающегосясписка ............................................... 296
8.2.5Тег-хелперысообщенийвалидациии сводкисообщений(ValidationSummary) ....................................................................... 302

8.3 
Создание ссылок с по мощью тег-хелпера якоря  

 
(Anchor Tag Helper) ................................................................................. 305

8.4 
Сброс кеша с по мощью тег-хелпера добавления  

 
версии (Append Version Tag Helper) .................................................... 307

8.5 
Использование условной разметки с помощью  

 
тег-хелпера окружения .......................................................................... 308

Резюме .................................................................................................................. 310

9 

Создание веб-API для мобильных и клиентских  

 
приложений  с по мощью MVC ........................................................ 313
9.1 
Что такое веб-API, и когда его следует использовать? ................... 314

9.2 
Создание первого проекта веб-API .................................................... 318

9.3 
Применение паттерна проектирования MVC к веб-API ................ 326

9.4 
Маршрутизация на основе атрибутов: связывание  

 
методов действий с URL-адресами ..................................................... 330
9.4.1Сочетаниеатрибутовмаршрута,чтобываши шаблонымаршрутовследовалипринципуDRY ............................................. 333
9.4.2Использованиезаменымаркерадляуменьшениядублированияпримаршрутизациинаосновеатрибутов ............. 334
9.4.3ОбработкаHTTP-методовс помощьюмаршрутизациинаосновеатрибутов ...................................................................... 335

9.5 
Использование общепринятых соглашений с атрибутом  

 
[ApiController]........................................................................................... 337

9.6 
Генерация ответа от модели ................................................................. 341
9.6.1Настройкаформатеровпоумолчанию:добавляем  
поддержкуXML ............................................................................... 343
9.6.2Выборформатаответас помощьюсогласованиясодержимого .... 345

Резюме .................................................................................................................. 347
Содержание

Часть II 
СОЗДАНИЕ ПОЛНОЦЕННЫХ  
ПРИЛОЖЕНИЙ .......................................................................... 350

10 

Конфигурация сервисов с по мощью внедрения  

 
зависимостей ............................................................................................. 352
10.1 Введение во внедрение зависимостей............................................... 353
10.1.1Преимуществавнедрениязависимостей ....................................... 354
10.1.2Созданиеслабосвязанногокода ...................................................... 360
10.1.3Внедрениезависимостейв ASP.NETCore ....................................... 362

10.2 Использование контейнера внедрения зависимостей .................. 364
10.2.1ДобавлениесервисовфреймворкаASP.NETCoreв контейнер ....... 364
10.2.2Регистрациясобственныхсервисовв контейнере ......................... 367
10.2.3Регистрациясервисовс использованиемобъектови лямбда-функций ........................................................................... 369
10.2.4Многократнаярегистрациясервисав контейнере ....................... 374
10.2.5Внедрениесервисовв методыдействий,обработчики  
страници представления............................................................... 378

10.3 Жизненный цикл: когда создаются сервисы? ................................. 382
10.3.1Transient:всеуникально .................................................................. 385
10.3.2Scoped:давайтедержатьсявместе ............................................... 386
10.3.3Singleton:можетбытьтолькоодин .............................................. 387
10.3.4Следитезазахваченнымизависимостями .................................... 388

Резюме .................................................................................................................. 392

11 

Конфигурирование приложения ASP.NETCore ................ 394
11.1 Представляем модель конфигурации ASP.NET Core ....................... 395
11.2 Конфигурирование приложения с по мощью метода  
 
CreateDefaultBuilder ................................................................................ 397

11.3 Создание объекта конфигурации для вашего приложения .......... 399
11.3.1Добавлениепоставщикаконфигурациив файле Program.cs .......... 402
11.3.2Использованиенесколькихпоставщиковдля переопределениязначенийконфигурации ................................ 405
11.3.3Безопасноехранениесекретовконфигурации ................................ 407
11.3.4Перезагрузказначенийконфигурацииприихизменении ............... 412

11.4 Использование строго типизированных настроек  
 
с паттерном Options ............................................................................... 413
11.4.1Знакомствос интерфейсомIOptions ............................................. 415
11.4.2Перезагрузкастроготипизированныхпараметровс помощьюIOptionsSnapshot ........................................................... 417
11.4.3Разработкаклассовпараметровдляавтоматическойпривязки ... 418
11.4.4Связываниестроготипизированныхнастроекбез интерфейсаIOptions ................................................................. 420

11.5 Настройка приложения для нескольких окружений ...................... 422
11.5.1Определениеокруженияразмещения.............................................. 422
11.5.2Загрузкафайловконфигурациидляконкретногоокружения .......... 424
11.5.3Задаемокружениеразмещения ...................................................... 426

Резюме .................................................................................................................. 430
Содержание
12 

Cохраняем данные с Entity Framework Core  ..................... 432

12.1 Знакомство с Entity Framework Core ................................................... 434
12.1.1ЧтотакоеEFCore?......................................................................... 434
12.1.2Зачемиспользоватьинструментобъектно-реляционногоотображения? ................................................................................. 436
12.1.3КогдаследуетвыбиратьEFCore? .................................................. 437
12.1.4Отображениебазыданныхв кодприложения ............................... 439

12.2 Добавляем EF Core в приложение ....................................................... 441
12.2.1Выборпровайдерабазыданныхи установкаEFCore .................... 443
12.2.2Созданиемоделиданных ................................................................. 444
12.2.3Регистрацияконтекстаданных .................................................... 447

12.3 Управление изменениями с помощью миграций .......................... 448
12.3.1Создаемпервуюмиграцию .............................................................. 449
12.3.2Добавляемвторуюмиграцию ......................................................... 452

12.4 Выполнение запроса к базе данных и сохранение в ней  
 
данных ....................................................................................................... 455
12.4.1Созданиезаписи .............................................................................. 455
12.4.2Загрузкасписказаписей .................................................................. 458
12.4.3Загрузкаоднойзаписи ..................................................................... 460
12.4.4Обновлениемодели ......................................................................... 462

12.5 Использование EF Core в промышленных приложениях ............... 466
Резюме .................................................................................................................. 468

13 

Конвейер фильтров MVC и Razor Pages  .............................. 471

13.1 Что такое фильтры, и когда их использовать ................................... 473
13.1.1КонвейерфильтровMVC ................................................................ 474
13.1.2КонвейерфильтровRazorPages ..................................................... 476
13.1.3ФильтрыилипромежуточноеПО:чтовыбрать? ........................ 478
13.1.4Созданиепростогофильтра .......................................................... 479
13.1.5Добавляемфильтрык действиям,контроллерам,страницамRazorPagesи глобально ................................................................... 482
13.1.6Порядоквыполненияфильтров ...................................................... 485

13.2 Создание фильтров для приложения ................................................. 487
13.2.1Фильтрыавторизации:защитаAPI ............................................. 490
13.2.2Фильтрыресурсов:прерываниевыполненияметодовдействий .... 492
13.2.3Фильтрыдействий:настройкапривязкимоделии результатовдействий ................................................................ 494
13.2.4Фильтрыисключений:собственнаяобработкаисключенийдляметодовдействий ................................................ 499
13.2.5Фильтрырезультатов:настройкарезультатовдействийпередихвыполнением ..................................................... 501
13.2.6Фильтрыстраниц:настройкапривязкимоделидля RazorPages ................................................................................ 504

13.3 Прерывание выполнения конвейера ................................................. 506
13.4 Использование внедрения зависимостей с атрибутами  
 
фильтра ...................................................................................................... 508

Резюме .................................................................................................................. 511
Содержание
14 

Аутентификация: добавляем пользователей  

 
в приложение с по мощью ASP.NET Core Identity  ......... 513

14.1 Знакомство с аутентификацией и авторизацией ........................... 515
14.1.1Пользователии утвержденияв ASP.NETCore ............................... 515
14.1.2Аутентификацияв ASP.NETCore:сервисыи промежуточноеПО ...................................................................... 517
14.1.3АутентификациядляAPIи распределенныхприложений ............. 520

14.2 Что такое ASP.NET Core Identity? ......................................................... 524
14.3 Создание проекта, в котором используется ASP.NET  
 
Core Identity .............................................................................................. 527
14.3.1Созданиепроектаизшаблона ........................................................ 527
14.3.2Изучениешаблонав Обозревателерешений .................................. 529
14.3.3МодельданныхASP.NETCoreIdentity ............................................. 533
14.3.4Взаимодействиес ASP.NETCoreIdentity ........................................ 535

14.4 Добавляем ASP.NET Core Identity в существующий проект .......... 538
14.4.1НастройкасервисовASP.NETCoreIdentityи промежуточногоПО .................................................................... 539
14.4.2ОбновлениемоделиданныхEFCoreдляподдержкиIdentity ........... 541
14.4.3ОбновлениепредставленийRazorдлясвязис пользовательскиминтерфейсомIdentity ..................................... 542

14.5 Настройка страницы в пользовательском интерфейсе  
 
ASP.NET Core Identity по умолчанию ................................................. 544

14.6 Управление пользователями: добавление  
 
специальных данных для пользователей.......................................... 547

Резюме .................................................................................................................. 550

15 

Авторизация: обеспечиваем защиту  

 
приложения ................................................................................................. 553

15.1 Знакомство с авторизацией ................................................................. 555
15.2 Авторизация в ASP.NET Core ................................................................ 558
15.2.1Предотвращениедоступаанонимныхпользователейк вашемуприложению ..................................................................... 560
15.2.2Обработказапросов,непрошедшихаутентификацию ................ 562

15.3 Использование политик для авторизации на основе  
 
утверждений............................................................................................. 565

15.4 Создание специальных политик авторизации ................................ 569
15.4.1Требованияи обработчики:строительныеблокиполитики ........ 569
15.4.2Созданиеполитикисоспециальнымтребованиеми обработчиком .............................................................................. 571

15.5 Управление доступом с авторизацией на основе ресурсов .......... 577
15.5.1Ручнаяавторизациязапросовс помощьюинтерфейсаIAuthorizationService ........................................................................ 579
15.5.2СозданиеобработчикаAuthorizationHandlerна основе  
ресурсов ........................................................................................... 582

15.6 Скрытие элементов в шаблонах Razor  
 
от незарегистрированных пользователей ........................................ 585

Резюме .................................................................................................................. 588
Содержание
16 

Публикация и развертывание приложения  ..................... 590

16.1 Модель хостинга ASP.NET Core ............................................................ 592
16.1.1Запуски публикацияприложенияASP.NETCore ............................ 594
16.1.2Выборметодаразвертываниядлявашегоприложения ................ 598

16.2 Публикация приложения в IIS ............................................................. 600
16.2.1КонфигурированиеIISдляASP.NETCore ........................................ 600
16.2.2Подготовкаи публикацияприложенияв IIS ................................... 603

16.3 Размещение приложения в Linux........................................................ 606
16.3.1ЗапускприложенияASP.NETCoreзаобратнымпрокси-серверомв Linux .................................................................. 606
16.3.2Подготовкаприложенияк развертываниюв Linux ....................... 609

16.4 Настройка URL-адресов приложения ................................................. 611
16.5 Оптимизация клиентских ресурсов с помощью BundlerMinifier ... 615
16.5.1Ускорениеработыприложенияс помощьюупаковкии минификациикода........................................................................ 618
16.5.2ДобавляемBundlerMinifierв приложение ........................................ 620
16.5.3Использованиеминифицированныхфайловв промышленномокружениис помощьютег-хелпераокружения .............................. 623
16.5.4Обслуживаниечастоиспользуемыхфайловизсетидоставкисодержимого .................................................................... 624

Резюме .................................................................................................................. 625

Часть III 
РАСШИРЕНИЕ ПРИЛОЖЕНИЙ ................................ 628

17 

Мониторинг и устранение ошибок с помощью  

 
журналирования  ..................................................................................... 630

17.1 
Эффективное использование журналирования  

 
в промышленном приложении ........................................................... 632
17.1.1Выявлениепроблемс помощьюспециальныхсообщенийжурнала ........................................................................................... 633
17.1.2АбстракциижурналированияASP.NETCore .................................. 635

17.2 
Добавление сообщений журнала в приложение ............................. 636
17.2.1Уровеньсообщенияжурнала:наскольковажносообщениежурнала? ......................................................................................... 639
17.2.2Категориясообщенияжурнала:какойкомпонентсоздалжурнал ............................................................................................. 642
17.2.3Форматированиесообщенийи сборзначенийпараметров .............. 643

17.3 
Контроль места записи журналов с помощью поставщиков  

 
журналирования ...................................................................................... 645
17.3.1Добавлениеновогопоставщикажурналированияв приложение .... 646
17.3.2ЗаменаILoggerFactoryпоумолчаниюнаSerilog ............................. 649

17.4 
Изменение избыточности сообщений журналов  

 
с по мощью фильтрации ........................................................................ 653

17.5 
Структурное журналирование: создание полезных  

 
сообщений журналов  с возможностью поиска ................................ 658
17.5.1Добавлениепоставщикаструктурногожурналированияв приложение ................................................................................... 660
Содержание

17.5.2Использованиеобластейжурналированиядля добавлениядополнительныхсвойствв сообщения журнала ............................ 663

Резюме .................................................................................................................. 665

18 

Повышаем безопасность приложения  ................................. 667
18.1 Добавляем протокол HTTPS в приложение ...................................... 669
18.1.1ИспользованиеHTTPS-сертификатовдляразработки ................ 672
18.1.2НастройкаKestrelдляиспользованиясертификатаHTTPSв промышленномокружении ........................................................... 674
18.1.3Делаемтак,чтобыпротоколHTTPSиспользовалсядля всегоприложения ...................................................................... 676

18.2 Защита от межсайтового скриптинга ................................................ 681
18.3 Защита от межсайтовой подделки запросов (CSRF) ....................... 685
18.4 Вызов веб-API из других доменов с помощью CORS ..................... 691
18.4.1Разбираемсяс CORSи тем,каконработает ................................ 692
18.4.2ДобавлениеглобальнойполитикиCORSко всему приложению ..... 694
18.4.3ДобавляемCORSк определеннымдействиямвеб-APIс помощьюатрибутаEnableCors ................................................... 697
18.4.4НастройкаполитикCORS .............................................................. 698

18.5 Изучение других векторов атак ........................................................... 699
18.5.1Обнаружениеи предотвращениеатакс открытымперенаправлением ........................................................................... 700
18.5.2Предотвращениеатакс использованиемвнедренияSQL-кодас помощьюEFCoreи параметризации ........................... 702
18.5.3Предотвращениенебезопасныхпрямыхссылокна объекты ......... 704
18.5.4Защитапаролейи данныхпользователей ..................................... 705

Резюме .................................................................................................................. 707

19 

Создание специальных компонентов  .................................... 710
19.1 Настройка конвейера промежуточного ПО ...................................... 711
19.1.1Созданиепростыхконечныхточекс помощьюметодарасширенияRun .............................................................................. 713
19.1.2Ветвлениеконвейерас помощьюметодарасширения Map .......... 714
19.1.3Добавлениев конвейерс помощьюметодарасширения Use .......... 718
19.1.4Созданиеспециальногокомпонентапромежуточного ПО ............ 721

19.2 Создание специальных конечных точек с помощью  
 
маршрутизации конечных точек ........................................................ 724
19.2.1Созданиеспециальногокомпонентамаршрутизацииконечныхточек ............................................................................... 725
19.2.2Созданиепростыхконечныхточекс помощьюMapGetи WriteJsonAsync .............................................................................. 729
19.2.3Применениеавторизациик конечнымточкам .............................. 731

19.3 Работа с требованиями к сложной конфигурации ......................... 733
19.3.1Частичноесозданиеконфигурациидлянастройкидополнительныхпоставщиков ....................................................... 734
19.3.2ИспользованиесервисовдлянастройкиIOptionsс помощьюIConfigureOptions ........................................................... 736

19.4 Использование стороннего контейнера внедрения  
 
зависимостей ........................................................................................... 739

Резюме .................................................................................................................. 743
Содержание
20 

Создание специальных компонентов MVC  

 
и Razor Pages  .............................................................................................. 745

20.1 Создание специального тег-хелпера Razor ....................................... 746
20.1.1Выводинформацииобокружениис помощью  
специальноготег-хелпера ............................................................... 747
20.1.2Созданиеспециальноготег-хелперадляусловногоскрытияэлементов ........................................................................ 751
20.1.3Созданиетег-хелперадляпреобразованияMarkdownв HTML ......... 753

20.2 Компоненты представления: добавление логики  
 
в частичные представления ................................................................. 755

20.3 Создание специального атрибута валидации .................................. 761
20.4 Замена фреймворка валидации на FluentValidation ...................... 766
20.4.1СравнениеFluentValidationи атрибутовDataAnnotations ............ 767
20.4.2ДобавляемFluentValidationв приложение ...................................... 771

Резюме .................................................................................................................. 773

21 

Вызов удаленных API с помощью  

 
IHttpClientFactory  ................................................................................... 775

21.1 Вызов API для протокола HTTP: проблема с классом  
 
HttpClient .................................................................................................. 776

21.2 Создание экземпляров класса HttpClient с помощью  
 
интерфейса IHttpClientFactory ............................................................ 782
21.2.1ИспользованиеIHttpClientFactoryдляуправленияжизненнымцикломHttpClientHandler ............................................ 783
21.2.2Настройкаименованныхклиентоввовремярегистрации ........... 786
21.2.3Использованиетипизированныхклиентовдля инкапсуляцииHTTP-вызовов .................................................... 788

21.3 Обработка временных ошибок HTTP с помощью  
 
библиотеки Polly...................................................................................... 791

21.4 Создание специального обработчика HttpMessageHandler .......... 794
Резюме .................................................................................................................. 797

22 

Создание фоновых задач и сервисов ........................................ 799

22.1 Запуск фоновых задач с по мощью интерфейса  
 
IHostedService ........................................................................................... 800
22.1.1Запускфоновыхзадачпотаймеру ................................................. 801
22.1.2Использованиесервисовс жизненнымцикломScopedв фоновыхзадачах ........................................................................... 805

22.2 Создание сервисов рабочей роли без пользовательского  
 
интерфейса с использованием IHost.................................................. 807
22.2.1Созданиесервисарабочейролиизшаблона.................................... 809
22.2.2Запусксервисоврабочейролив промышленномокружении .......... 812

22.3 Координация фоновых задач с по мощью Quartz.NET ................... 815
22.3.1УстановкаQuartz.NETв приложениеASP.NETCore ...................... 816
22.3.2Настройказапусказаданияпорасписаниюс помощьюQuartz.NET ...................................................................................... 818
Содержание

22.3.3Использованиекластеризациидлядобавленияизбыточностив фоновыезадачи ............................................................................. 821

Резюме .................................................................................................................. 825

23 

Тестирование приложения ............................................................. 827
23.1 Тестирование в ASP.NET Core ............................................................... 829
23.2 Модульное тестирование с xUnit ......................................................... 831
23.2.1Созданиепервоготестовогопроекта ............................................ 831
23.2.2Запусктестовкомандойdotnettest ............................................... 833
23.2.3Ссылканаприложениеизтестовогопроекта .............................. 835
23.2.4Добавлениемодульныхтестовс атрибутамиFactи Theory ........ 838
23.2.5Тестированиеусловийотказа ........................................................ 842

23.3 Модульное тестирование специального промежуточного ПО .... 843
23.4 Модульное тестирование API-контроллеров ................................... 846
23.5 Интеграционное тестирование: тестирование всего  
 
приложения в памяти ............................................................................ 850
23.5.1СозданиеTestServerс помощьюпакетаTestHost ........................... 851
23.5.2Тестированиеприложенияс помощьюклассаWebApplicationFactory ..................................................................... 854
23.5.3Заменазависимостейв классеWebApplicationFactory ................... 857
23.5.4УменьшениедублированиякодазасчетсозданияспециальногоклассаWebApplicationFactory ................................... 859

23.6 Изоляция базы данных с по мощью поставщика EF Core  
 
в памяти .................................................................................................... 861

Резюме .................................................................................................................. 866

ПриложениеА.Подготовкаокружения разработки .................................... 869

ПриложениеВ.Экосистема.NET ...................................................................... 876

ПриложениеC.Полезныессылки ....................................................................... 895

Предметныйуказатель ..................................................................................... 901
Вступительноесловоот сообщества

.NET уже много лет является одним из лидирующих фреймворков для 
разработки веб-приложений. Пройдя длинный путь от ASP.NET до современного 
ASP.NET Core, он вобрал в себя все лучшие подходы к разработке 
приложений с отрисовкой на стороне сервера и веб-API-приложений. 
ASP.NET Core – продукт с открытым исходным кодом, каждый может 
изучить любой аспект его работы. Однако объем кода велик, и не так-
то просто сразу понять, что искать и как разбираться с ним. Microsoft 
предоставляет отличную документацию по основам серверной веб-
разработки и ASP.NET Core на официальном сайте, однако этого может 
быть недостаточно для выстраивания целостной картины.
Именно поэтому данная книга очень ценна. Автор превосходно знает 
ASP.NET Core, работал с ним с первых версий и как никто другой понимает, 
какие аспекты фреймворка наиболее важны для его успешного 
использования. Разработчику, помимо работы с основной логикой приложения, 
важно понимать, как работать с настройками, журналировани-
ем, авторизацией, как обеспечивать безопасность приложений. Все эти 
темы тщательно рассмотрены в книге. Автору удалось охватить широту 
фреймворка, рассмотрев большое количество различных аспектов, и при 
этом достаточно глубоко разобрать многие из них. Все это позволяет рассматривать 
эту книгу как отличный способ подробного знакомства с разработкой 
серверных приложений на .NET.
Систематизированной информации об ASP.NET Core на русском языке 
мало. Фреймворк быстро развивается, постоянно появляются новые термины, 
и даже те, что давно используются, не всегда имеют устоявшийся 
перевод. Мы обсуждали, спорили, думали о том, как читатели будут искать 
термины в сети интернет, как они звучат в неформальных беседах. 
Что-то получилось хорошо, что-то не очень, но в целом мы довольны 
результатом и рады, что такая интересная и полезная книга есть теперь 
и на русском языке. Отдельная благодарность автору за простые и по-
Вступительное слово от сообщества

нятные примеры кода и отличные иллюстрации, наглядно демонстрирующие 
объясняемые концепции.
Добро пожаловать в мир ASP.NET Core, и приятного чтения!

Российскоесообщество.NETразработчиковDotNet.Ru

Над переводом работали представители сообщества DotNet.Ru:

 Игорь Лабутин;

 Андрей Беленцов;

 Максим Шошин;

 Вадим Мингажев;

 Сергей Бензенко;

 Радмир Тагиров;

 Эмиль Янгиров;

 Анатолий Кулаков.
Предисловие

ASP.NET Core 5.0 появился в 2020 году, более чем через четыре года после 
выпуска ASP.NET Core 1.0, но ASP.NET также имеет долгую историю, 
которая послужила основой и стимулом для развития ASP.NET Core.
Microsoft выпустила первую версию ASP.NET в 2002 году как часть 
платформы .NET Framework 1.0. С тех пор она прошла несколько выпусков, 
в каждом из которых были добавлены функции и расширяемость. 
Однако каждый выпуск был построен на основе .NET Framework, поэтому 
она предустановлена во всех версиях Windows.
Это приносит смешанные преимущества: с одной стороны, сегодня 
ASP.NET 4.x является надежной, проверенной в боях платформой для 
создания современных приложений для ОС Windows. С другой стороны, 
она ограничена этой зависимостью – изменения в базовой платформе 
.NET Framework имеют далеко идущие последствия, в результате чего 
наблю дается замедление скорости развертывания, а это оставляет за 
бортом многих разработчиков, создающих и развертывающих приложения 
для Linux или macOS.
Когда я впервые начал изучать ASP.NET Core, я был одним из таких 
разработчиков. Будучи в душе пользователем Windows, я получил от 
свое го работодателя компьютер с macOS и поэтому все время работал на 
виртуальной машине. ASP.NET Core обещал все это изменить, позволив 
вести разработку и на компьютере с Windows, и на компьютере с macOS.
Можно сказать, что я опоздал во многих отношениях, проявляя активный 
интерес только перед выходом релиза-кандидата ASP.NET Core RC2. 
К тому моменту существовало уже восемь бета-версий, многие из которых 
содержали существенные критические изменения. Не погружаясь во 
все это полностью до выхода RC2, я избавился от сырых инструментов 
и меняющихся API.
То, что я увидел в тот момент, меня очень впечатлило. ASP.NET Core 
позволяет разработчикам использовать имеющиеся у них знания 
о платформе .NET и приложениях ASP.NET MVC, в частности используя 
текущие передовые практики, такие как внедрение зависимостей, строго 
типизированная конфигурация и журналирование. Кроме того, мож-
Предисловие

но было создавать и развертывать кросс-платформенные приложения. 
Я не устоял.
Эта книга появилась во многом благодаря моему подходу к изучению 
ASP.NET Core. Вместо того чтобы просто читать документацию и статьи 
в блогах, я решил попробовать что-то новое и начать писать о том, что 
я узнал. Каждую неделю я посвящал время изучению нового аспекта ASP.
NET Core и писал об этом сообщение в блоге. Когда появилась возможность 
написать книгу, я ухватился за этот шанс – это еще один повод 
подробно изучить фреймворк!
С тех пор, как я начал писать эту книгу, многое изменилось как в отношении 
самой книги, так и ASP.NET Core. Первый крупный выпуск 
фреймворка в июне 2016 года по-прежнему имел много шероховатостей, 
в частности что касалось работы с инструментами. С выпуском .NET 5.0 
в ноябре 2020 года ASP.NET Core действительно стал самостоятельным: 
API и инструменты достигли зрелого уровня. Данная книга нацелена на 
версию .NET 5.0 для ASP.NET Core, но если вы используете хотя бы версию .
NET Core 3.1, то сможете без проблем работать с этим изданием.
В этой книге рассказывается обо всем, что вам нужно для начала работы 
с ASP.NET Core, независимо от того, новичок ли вы в веб-разработке 
или уже являетесь разработчиком ASP.NET. В ней очень много внимания 
уделяется самому фреймворку, поэтому я не буду вдаваться в подробности, 
касающиеся клиентских фреймворков, таких как Angular и React, 
или таких технологий, как Docker. Я также не описываю все новые функции .
NET 5.0, такие как Blazor и gRPC. Вместо этого я даю ссылки, по которым 
вы можете найти дополнительную информацию.
Мы сосредоточимся на создании приложений с отрисовкой на стороне 
сервера, используя страницы Razor и веб-API, применяя контроллеры 
MVC. Вы познакомитесь с основами ASP.NET Core, такими как промежуточное 
ПО, внедрение зависимостей и конфигурация, а также узнаете, 
как настроить их в соответствии со своими требованиями. Вы узнаете, 
как добавить аутентификацию и авторизацию в свои приложения, как 
повысить их безопасность, а также как развертывать их и осуществлять 
мониторинг. Наконец, вы узнаете, как тестировать приложения, используя 
модульные и интеграционные тесты.
Лично мне приятно работать с приложениями ASP.NET Core по сравнению 
с приложениями, использующими предыдущую версию ASP.NET, 
и надеюсь, что эта страсть проявится в данной книге!
Благодарности

Хотя на обложке этой книги только одно имя, множество людей внесли 
свой вклад как в ее написание, так и в публикацию. В этом разделе я хотел 
бы поблагодарить всех, кто поддерживал меня, оказывал содействие 
и терпел меня в течение прошлого года.
Прежде всего я хочу поблагодарить свою девушку Бекки. Твоя постоянная 
поддержка и воодушевление – все для меня. Они помогли мне пережить 
этот напряженный период. Ты приняла на себя всю тяжесть этого 
стресса и давления, и я бесконечно благодарен тебе. Безмерно люблю тебя.
Я также хотел бы поблагодарить всю свою семью за их поддержку. 
В частности, моих родителей, Жен и Боба, за то, что терпели мои разглагольствования, 
и свою сестру, Аманду, за все ее веселые беседы.
На профессиональном уровне я хотел бы поблагодарить издательство 
Manning за предоставленную мне возможность. Брайан Сойер «нашел» 
меня в первом издании этой книги и побудил меня заняться вторым 
изданием. Марина Майклс стала моим редактором-консультантом по 
ауди тории второй раз подряд и снова была то дотошной, то критически 
настроенной, то обнадеживающей и восторженной. Книга, несомненно, 
стала лучше благодаря вашему участию. Я также благодарю редактора 
проекта Дейдру Хиам, редактора Энди Кэрролла, своего корректора 
Джейсона Эверетта и редактора-рецензента Михаэла Батиника.
Я благодарен техническому редактору Марку Элстону и корректору 
Тане Уилке. Марк оказал неоценимую поддержку, подчеркнув мои неверные 
предположения и технические предубеждения, касающиеся работы 
с хорошо знакомым мне фреймворком. Таня Уилке подтвердила, 
что написанный мной код действительно работает и что он не лишен 
смысла.
Я сердечно благодарю всех сотрудников Manning, которые помогли 
издать эту книгу и вывести ее на рынок. Я также хотел бы поблагодарить 
всех рецензентов MEAP за их комментарии, которые помогли улучшить 
книгу.
Я бы никогда не смог написать ее, если бы не отличный контент, созданный 
сообществом .NET и теми пользователями, на которых я подпи-
Благодарности

сан в Twitter. В частности, спасибо Джону Гэллоуэю за регулярное размещение 
моего блога на форуме сообщества ASP.NET.
Наконец, спасибо всем друзьям, которые воодушевляли и поддерживали 
меня и в целом проявляли интерес. Возможно, нам не удавалось 
встречаться настолько часто, насколько нам хотелось бы, но я с нетерпением 
жду возможности как можно скорее собраться вместе и выпить.
Благодарю всех рецензентов: Эла Пезевски (Al Pezewski), Бена Мак-
намару (Ben McNamara), Даниэля Васкеса (Daniel Vásquez), Филипа Вой-
чешина (Filip Wojcieszyn), Фостера Хейнса (Foster Haines), Густаво Филипе 
Рамоса Гомеса (Gustavo Filipe Ramos Gomes), Жана-Франсуа Морена 
(Jean-François Morin), Джоэля Котарски (Joel Kotarski), Джона Гатри (John 
Guthrie), Хуана Луиса Барреду (Juan Luis Barreda), Луиса Му (Luis Moux), 
Майка Эриксона (Mike Erickson), Раушана Джа (Raushan Jha), Роба Ройт-
ча (Rob Ruetsch), Рона Лиза (Ron Lease), Рубена Вандегинсте (Ruben Van-
deginste), Сау Фай Фонг (Sau Fai Fong), Стива Лава (Steve Love), Таню 
Уилке (Tanya Wilke), Винсента Делкойна (Vincent Delcoigne) и Уиллиса Г. 
Хэмптона (Willis G. Hampton) – ваши предложения помогли сделать эту 
книгу лучше.
Доступ онлайн
2 049 ₽
В корзину