Современные веб-технологии
Модели разработки
Особенности платформы
Особенности платформы
ASP.NET Core
ASP.NET Core
ASP.NET Core
ASP.NET Core
ASP.NET Core
ASP.NET Core
Структура проекта ASP.NET Core
Program.cs
ASP.NET Core
Класс WebApplicationBuilder
Свойства WebApplicationBuilder
Класс WebApplication
Класс WebApplication
Конвейер обработки запроса и middleware
ASP.NET Core
ASP.NET Core
Встроенные компоненты middleware
Встроенные компоненты middleware
Встроенные компоненты middleware
Встроенные компоненты middleware
WelcomePageMiddleware
Жизненный цикл middleware
Жизненный цикл middleware
HttpResponse. Отправка ответа
HttpResponse. Отправка ответа
HttpResponse
HttpRequest. Получение данных запроса
HttpRequest. Получение данных запроса
HttpRequest. Получение данных запроса
Получение заголовков запроса
Получение заголовков запроса
Строка запроса
Метод Use
Метод Use
Метод Map
Построение конвейера обработки запроса
Построение конвейера обработки запроса
Построение конвейера обработки запроса
Построение конвейера обработки запроса
Построение конвейера обработки запроса
Построение конвейера обработки запроса

Современные веб-технологии

1. Современные веб-технологии

2. Модели разработки

Базовый ASP.NET Core
маршрутизация, конфигурация, логгирования, возможность
работы с различными системами баз данных и т.д.
ASP.NET Core MVC
Razor Pages
ASP.NET Core Web API
Blazor
2

3. Особенности платформы

ASP.NET Core работает поверх платформы .NET и, таким
образом, позволяет задействовать весь ее функционал.
В качестве языков разработки применяются языки
программирования, поддерживаемые платформой .NET.
ASP.NET Core представляет кросс-платформенный
фреймворк.
3

4. Особенности платформы

Благодаря модульности фреймворка все необходимые
компоненты веб-приложения могут загружаться как
отдельные модули через пакетный менеджер Nuget.
Поддержка работы с большинством распространенных
систем баз данных: MS SQL Server, MySQL, Postgres,
MongoDB
ASP.NET Core характеризуется расширяемостью.
Богатый инструментарий для разработки приложений.
4

5. ASP.NET Core

Для разработки под ASP.NET Core можно использовать
различный инструментарий
Visual Studio 2022 Community
Visual Studio Code
https://visualstudio.microsoft.com/ru/downloads/
5

6. ASP.NET Core

6

7. ASP.NET Core

7

8. ASP.NET Core

На следующем шаге зададим имя проекта и определим для
него местоположение на жестком диске:
8

9. ASP.NET Core

9

10. ASP.NET Core

10

11. Структура проекта ASP.NET Core

Connected Services: подключенные сервисы из Azure
Dependencies: все добавленные в проект пакеты и
библиотеки, иначе говоря зависимости
Properties: узел, который содержит некоторые настройки
проекта. В частности, в
файле launchSettings.json описаны настройки запуска
проекта, например, адреса, по которым будет запускаться
приложение.
appsettings.json: файл конфигурации проекта в формате
json
Program.cs: главный файл приложения, с которого и
начинается его выполнение. Код этого файла настраивает
и запускает веб-приложение
11

12. Program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
12

13. ASP.NET Core

В центре приложения ASP.NET находится класс WebApplication.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
13

14. Класс WebApplicationBuilder

Установка конфигурации приложения
Добавление сервисов
Настройка логгирования в приложении
Установка окружения приложения
Конфигурация объектов IHostBuilder и IWebHostBuilder,
которые применяются для создания хоста приложения
14

15. Свойства WebApplicationBuilder

Configuration: представляет объект ConfigurationManager,
который применяется для добавления конфигурации к
приложению.
Environment: предоставляет информацию об окружении,
в котором запущено приложение.
Host: объект IHostBuilder, который применяется для
настройки хоста.
Logging: позволяет определить настройки логгирования в
приложении.
Services: представляет коллекцию сервисов и позволяет
добавлять сервисы в приложение.
WebHost: объект IWebHostBuilder, который позволяет
настроить отдельные настройки сервера.
15

16. Класс WebApplication

Класс WebApplication применяет три интерфейса:
IHost: применяется для запуска и остановки хоста,
который прослушивает входящие запросы
IApplicationBuilder: применяется для установки
компонентов, которые участвуют в обработке запроса
IEndpointRouteBuilder: применяется для установки
маршрутов, которые сопоставляются с запросами
16

17. Класс WebApplication

Run(): запускает приложение
RunAsync(): асинхронно запускает приложение
Start(): запускает приложение
StartAsync(): запускает приложение
StopAsync(): останавливает приложение
17

18. Конвейер обработки запроса и middleware

18

19. ASP.NET Core

Connection: представляет информацию о подключении, которое
установлено для данного запроса
Features: получает коллекцию HTTP-функциональностей, которые
доступны для этого запроса
Items: получает или устанавливает коллекцию пар ключ-значение для
хранения некоторых данных для текущего запроса
Request: возвращает объект HttpRequest, который хранит
информацию о текущем запросе
RequestAborted: уведомляет приложение, когда подключение
прерывается, и соответственно обработка запроса должна быть
отменена
19

20. ASP.NET Core

RequestServices: получает или устанавливает
объект IServiceProvider, который предоставляет доступ к контейнеру
сервисов запроса
Response: возвращает объект HttpResponse, который позволяет
управлять ответом клиенту
Session: хранит данные сессии для текущего запроса
TraceIdentifier: представляет уникальный идентификатор запроса для
логов трассировки
User: представляет пользователя, ассоциированного с этим запросом
WebSockets: возвращает объект для управления подключениями
WebSocket для данного запроса
20

21. Встроенные компоненты middleware

Authentication: предоставляет поддержку аутентификации
Authorization: предоставляет поддержку авторизации
Cookie Policy: отслеживает согласие пользователя на хранение
связанной с ним информации в куках
CORS: обеспечивает поддержку кроссдоменных запросов
DeveloperExceptionPage: генерирует веб-страницу с информацией об
ошибке при работе в режиме разработки
Diagnostics: набор middleware, который предоставляет страницы
статусных кодов, функционал обработки исключений, страницу
исключений разработчика
21

22. Встроенные компоненты middleware

Forwarded Headers: перенаправляет заголовки запроса
Health Check: проверяет работоспособность приложения asp.net core
Header Propagation: обеспечивает передачу заголовков из HTTPзапроса
HTTP Logging: логгирует информацию о входящих запросах и
генерируемых ответах
HTTP Method Override: позволяет входящему POST-запросу
переопределить метод
HTTPS Redirection: перенаправляет все запросы HTTP на HTTPS
22

23. Встроенные компоненты middleware

HTTP Strict Transport Security (HSTS): для улучшения безопасности
приложения добавляет специальный заголовок ответа
MVC: обеспечивает функционал фреймворка MVC
OWIN: обеспечивает взаимодействие с приложениями, серверами и
компонентами, построенными на основе спецификации OWIN
Request Localization: обеспечивает поддержку локализации
Response Caching: позволяет кэшировать результаты запросов
Response Compression: обеспечивает сжатие ответа клиенту
23

24. Встроенные компоненты middleware

URL Rewrite: предоставляет функциональность URL Rewriting
Endpoint Routing: предоставляет механизм маршрутизации
Session: предоставляет поддержку сессий
SPA: обрабатывает все запросы, возвращая страницу по умолчанию
для SPA-приложения (одностраничного приложения)
Static Files: предоставляет поддержку обработки статических файлов
WebSockets: добавляет поддержку протокола WebSockets
W3CLogging: генерирует логи доступа в соответствии с форматом
W3C Extended Log File Format
24

25. WelcomePageMiddleware

var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.UseWelcomePage(); // подключение WelcomePageMiddleware
app.Run();
25

26. Жизненный цикл middleware

var builder = WebApplication.CreateBuilder();
var app = builder.Build();
int x = 2;
app.Run(async (context) =>
{
x = x * 2; // 2 * 2 = 4
await context.Response.WriteAsync($"Result: {x}");
});
app.Run();
26

27. Жизненный цикл middleware

27

28. HttpResponse. Отправка ответа

Body: получает или устанавливает тело ответа в виде
объекта Stream
BodyWriter: возвращает объект типа PipeWriter для записи
ответа
ContentLength: получает или устанавливает заголовок
Content-Length
ContentType: получает или устанавливает заголовок
Content-Type
Cookies: возвращает куки, отправляемые в ответе
28

29. HttpResponse. Отправка ответа

HasStarted: возвращает true, если отправка ответа уже
началась
Headers: возвращает заголовки ответа
Host: получает или устанавливает заголовок Host
HttpContext: возвращает объект HttpContext, связанный с
данным объектом Response
StatusCode: возвращает или устанавливает статусный код
ответа
29

30. HttpResponse

Redirect(): выполняет переадресацию (временную или
постоянную) на другой ресурс
WriteAsJson()/WriteAsJsonAsync(): отправляет ответ в
виде объектов в формате JSON
WriteAsync(): отправляет некоторое содержимое. Одна из
версий метода позволяет указать кодировку. Если
кодировка не указана, то по умолчанию применяется
кодировка UTF-8
SendFileAsync(): отправляет файл
30

31. HttpRequest. Получение данных запроса

Body: предоставляет тело запроса в виде объекта Stream
BodyReader: возвращает объект типа PipeReader для чтения тела
запроса
ContentLength: получает или устанавливает заголовок Content-Length
ContentType: получает или устанавливает заголовок Content-Type
Cookies: возвращает коллекцию куки (объект Cookies),
ассоциированных с данным запросом
Form: получает или устанавливает тело запроса в виде форм
31

32. HttpRequest. Получение данных запроса

HasFormContentType: проверяет наличие заголовка Content-Type
Headers: возвращает заголовки запроса
Host: получает или устанавливает заголовок Host
HttpContext: возвращает связанный с данным запросом объект
HttpContext
IsHttps: возвращает true, если применяется протокол https
Method: получает или устанавливает метод HTTP
32

33. HttpRequest. Получение данных запроса

Path: получает или устанавливает путь запроса в виде объекта
RequestPath
PathBase: получает или устанавливает базовый путь запроса. Такой
путь не должен содержать завершающий слеш
Protocol: получает или устанавливает протокол, например, HTTP
Query: возвращает коллекцию параметров из строки запроса
QueryString: получает или устанавливает строку запроса
RouteValues: получает данные маршрута для текущего запроса
Scheme: получает или устанавливает схему запроса HTTP
33

34. Получение заголовков запроса

var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.Run(async(context) =>
{
context.Response.ContentType = "text/html; charset=utf-8";
var stringBuilder = new System.Text.StringBuilder("<table>");
foreach(var header in context.Request.Headers)
{
stringBuilder.Append($"<tr><td>{header.Key}</td><td>{header.Value}</td></tr>");
}
stringBuilder.Append("</table>");
await context.Response.WriteAsync(stringBuilder.ToString());
});
app.Run();
34

35. Получение заголовков запроса

35

36. Строка запроса

var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.Run(async(context) =>
{
context.Response.ContentType = "text/html; charset=utf-8";
await context.Response.WriteAsync($"<p>Path: {context.Request.Path}</p>" +
$"<p>QueryString: {context.Request.QueryString}</p>");
});
app.Run();
36

37. Метод Use

app.Use(async (context, next) =>
{
// действия перед передачи запроса в следующий middleware
await next.Invoke();
// действия после обработки запроса следующим middleware
});
37

38. Метод Use

Работа middleware разбивается на две части:
Middleware выполняет некоторую начальную обработку
запроса до вызова await next.Invoke()
Затем вызывается метод next.Invoke(), который передает
обработку запроса следующему компоненту в конвейере
Когда следующий в конвейере компонент закончил
обработку запрос возвращается в обратно в текущий
компонент, и выполняются действия, которые идут после
вызова await next.Invoke()
38

39. Метод Map

var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.Map("/time", appBuilder =>
{
var time = DateTime.Now.ToShortTimeString();
// логгируем данные - выводим на консоль приложения
appBuilder.Use(async(context, next) =>
{
Console.WriteLine($"Time: {time}");
await next(); // вызываем следующий middleware
});
appBuilder.Run(async context => await context.Response.WriteAsync($"Time: {time}"));
});
app.Run(async (context) => await context.Response.WriteAsync("Hello"));
app.Run();
39

40. Построение конвейера обработки запроса

public class RoutingMiddleware
{
readonly RequestDelegate next;
public RoutingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task InvokeAsync(HttpContext context)
{
string path = context.Request.Path;
if (path == "/index")
{
await context.Response.WriteAsync("Home Page");
}
else if (path == "/about")
{
await context.Response.WriteAsync("About Page");
}
else
{
context.Response.StatusCode = 404;
await context.Response.WriteAsync("Not Found");
}
}
}
40

41. Построение конвейера обработки запроса

public class AuthenticationMiddleware
{
readonly RequestDelegate next;
public AuthenticationMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var token = context.Request.Query["token"];
if (string.IsNullOrWhiteSpace(token))
{
context.Response.StatusCode = 403;
}
else
{
await next.Invoke(context);
}
}
}
41

42. Построение конвейера обработки запроса

42

43. Построение конвейера обработки запроса

public class ErrorHandlingMiddleware
{
readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task InvokeAsync(HttpContext context)
{
await next.Invoke(context);
if (context.Response.StatusCode == 403)
{
await context.Response.WriteAsync("Access Denied");
}
else if (context.Response.StatusCode == 404)
{
await context.Response.WriteAsync("Not Found");
}
}
}
43

44. Построение конвейера обработки запроса

44

45. Построение конвейера обработки запроса

45
English     Русский Правила