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

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

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     Русский Правила