Similar presentations:
Современные веб-технологии
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
67. ASP.NET Core
78. ASP.NET Core
На следующем шаге зададим имя проекта и определим длянего местоположение на жестком диске:
8
9. ASP.NET Core
910. ASP.NET Core
1011. Структура проекта ASP.NET Core
Connected Services: подключенные сервисы из AzureDependencies: все добавленные в проект пакеты и
библиотеки, иначе говоря зависимости
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
1819. 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 RewritingEndpoint 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
2728. 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: предоставляет тело запроса в виде объекта StreamBodyReader: возвращает объект типа PipeReader для чтения тела
запроса
ContentLength: получает или устанавливает заголовок Content-Length
ContentType: получает или устанавливает заголовок Content-Type
Cookies: возвращает коллекцию куки (объект Cookies),
ассоциированных с данным запросом
Form: получает или устанавливает тело запроса в виде форм
31
32. HttpRequest. Получение данных запроса
HasFormContentType: проверяет наличие заголовка Content-TypeHeaders: возвращает заголовки запроса
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. Получение заголовков запроса
3536. Строка запроса
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. Построение конвейера обработки запроса
4243. Построение конвейера обработки запроса
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