ASP.NET Core Flashcards
Классы WebApplication и WebApplicationBuilder
WebApplicationBuilder - создает объект приложения WebApplication, настраивая конфигурации, добавляя сервисы в DI-контейнер, настраивая логирование, окружение, конфигурацию хоста IHostBuilder.
Для управления хостом WebApplication определяет следующие методы:
- Run/RunAsync
- Start/StartAsync
- StopAsync
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet(“/”, () => “Hello World!”);
app.Run();
Паттерн MVC
Паттерн MVC - разделение приложения на три компонента:
1) Модель (описывает используемые в приложении данные, логику валидации данных):
1.1) Модель представлений (используется представлениями для отображения, не все свойства нужны представлению)
1.2) Модель домена (описывает логику управления данными )
2) Представление (отвечает за визуальную часть или пользовательский интерфейс)
3) Контроллер (центральный компонент MVC, который обеспечивает связь между пользователем и приложением, представлением и хранилищем данных, содержит логику обработки запроса пользователя)
Модель является независимым компонентом.
Благодаря разделению ответственности приложение легче разрабатывать, поддерживать и тестировать отдельные компоненты.
Функциональность MVC можно добавлять разными способами:
- AddMvc() - добавляет все сервисы фреймворка MVC (в том числе сервисы для работы с аутентификацией и авторизацией, валидацией и т.д.)
- AddMvcCore() - добавляет только основные сервисы фреймворка MVC
- AddControllersWithViews() - добавляет только те сервисы фреймворка MVC, которые позволяют использовать контроллеры и представления и связанную функциональность
- AddControllers() -позволяет использовать контроллеры, но без представлений
Мастер-страница Layout.cshtml
Мастер-страницы применяются для создания единообразного, унифицированного вида сайта.
Layout.cshtml - обычное представление, в которое включает в себя другие отдельные представления (определяет общее для всех веб-страниц):
- метод RenderBody() подставляет вместо себя конкретное представление
Конвейер обработки запроса и middleware
Обработка запроса в ASP.NET Core устроена по принципу конвейера по всем встроенным в конвейер компонентам (middleware).
Компонент middleware может либо передать запрос далее следующему в конвейере компоненту, либо выполнить обработку (как до, так и после следующего) и закончить работу конвейера.
Компоненты middleware встраиваются с помощью методов расширений:
- Run (такие компоненты обработку запроса дальше не передают)
- Map (применяется для сопоставления пути запроса с определенным делегатом, который будет обрабатывать запрос по этому пути)
- Use (такие компоненты передают запрос следующим)
Порядок подключения middleware имеет значение.
Способы маршрутизации
Способы маршрутизации в MVC:
- с помощью Endpoints (новый способ)
- с помощью RouterMiddleware (старый способ)
Маршрутизация MVC с помощью Endpoints
Достигается с помощью компонентов:
- EndpointRoutingMiddleware (UseRouting)
- EndpointMiddleware (UseEndpoints)
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// определение маршрутов
endpoints.MapControllerRoute(
name: “default”,
pattern: “{controller=Home}/{action=Index}/{id?}”);
});
параметр pattern
определяет шаблон маршрута, с которым будут сопоставляться входящие запросы.
Маршрутизация MVC с помощью RouterMiddleware и метода UseMvc
// добавление компонентов mvc и определение маршрута
app.UseMvc(routes =>
{
routes.MapRoute(“api”, “api/get”, new { controller = “Home”, action = “About” });
routes.MapRoute(
name: “default”,
template: “{controller=Home}/{action=Index}/{id?}”);
});
Маршрутизация MVC на основе атрибутов
- Маршруты, определенные с помощью атрибутов, имеют
высший приоритет. - Может применяться при новом и старом способе маршрутизации
- Атрибут маршрута можно установить глобально для всего контроллера
- для одного действия можно задать несколько маршрутов[Route(“Home/Index”)]
public IActionResult Index()
{
return Content(“ASP.NET Core на metanit.com”);
} - Можно применять ограничения маршрута:
[Route(“{id:int}/{name:maxlength(10)}”)]
public IActionResult Test(int id, string name)
{
return Content($” id={id} | name={name}”);
}
Области в системе маршрутизации
Область - представляет сегмент приложения, имеет свою собственную структуру каталогов.
Атрибут Area - позволяет ассоциировать контроллер с областью
[Area("Store")] public class HomeController : Controller { public IActionResult Index() { return View(); } }
Метод MapAreaControllerRoute - указать маршрут для области
Маршрутизация ASP.NET
- на основе Endpoints:
app.Map(“/”, () => “Index Page”);
//Маршрут с параметрами
app.Map(“/users/{id}”, (string id) => $”User Id: {id}”);
//Маршрут с параметром сложного типа данных
app.MapGet(“/user”, ([AsParameters] Person person) => $”Name: {person.Name} Age: {person.Age}”);
- Если обработчик запроса конечной точки возвращает в ответ объект класса, то по умолчанию подобные объекты при отправке сериализуются в JSON.
- Маршрут с параметрами:
app.Map(“/users/{id}”, (string id) => $”User Id: {id}”);
Настройка ASP.NET Core для работы с прокси
Исходная схема HTTPS-запроса и исходный ip-адрес теряется при его передаче через прокси-сервер, поэтому их нужно доп. передать в заголовке.
Прокси-серверы передают данные в заголовках HTTP:
- X-Forwarded-For (Содержит сведения о клиенте, который создал этот запрос, и обо всех предыдущих узлах в цепочке прокси-серверов)
- X-Forwarded-Proto (Значение исходной схемы передачи данных (HTTP или HTTPS) или список схем в цепочке)
- X-Forwarded-Host (Исходное значение поля Host в заголовке запроса)
- X-Forwarded-Prefix (Исходный базовый путь, запрошенный клиентом)
Чтобы получить заголовки от прокси-сервера, нужно добавить мидлварь ForwardedHeadersMiddleware (UseForwardedHeaders), которая считывает эти заголовки и заполняет ими поля HttpContext.
//установка опций для ForwardedHeadersMiddleware
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardLimit = 2;
options.KnownProxies.Add(IPAddress.Parse("127.0.10.1"));
options.ForwardedForHeaderName = "X-Forwarded-For-My-Custom-Header-Name";
});</ForwardedHeadersOptions>
app.UseForwardedHeaders();
Отличия ASP.NET и ASP.NET Core
ASP.NET - платформа разработки веб-приложений для Windows, в состав котор. входят веб-сервисы.
ASP.NET Core:
- кроссплатформенный opensource-фреймворк
- встроенная поддержка DI
- модульная структура (можно подключать только нужные модули)
- Унифицированные контроллеры MVC и Web API
Авторизация по ролям
Авторизация по ролям позволяет разграничить доступ к ресурсам приложения в зависимости от роли.
[Authorize(Roles = “admin”)]
Чтобы использовать атрибут Authorize, нужно встроить в конвейер AuthorizationMiddleware (UseAuthorization) и подключить сервисы авторизации (AddAuthorization).
Аутентификация и авторизация
Аутентификация - процесс определения пользователя.
Авторизация - процесс определения, имеет ли пользователь право доступа к некоторому ресурсу.
Для встраивания в аутентификации в конвейер нужна AuthenticationMiddleware (UseAuthentication), которая использует сервисы аутентификации (регистрируются с помощью AddAuthentication)
Схемы аутентификации
Схема аутентификации позволяет выбрать определенный обработчик аутентификации.
Распространенные схемы аутентификации:
- “Cookies”:
- JWT “Bearer”
builder.Services.AddAuthentication(“Bearer”).AddJwtBearer();
builder.Services.AddAuthentication(“Cookies”).AddCookie();
Конфигурация
Конфигурация (IConfiguration, IConfigurationRoot (наследник)) - определяет базовые настройки приложения, может получать настройки из источников:
- args
- переменных среды
- из памяти
- из файла
- из кастомных источников
Конфигурация в файлах JSON, XML и Ini
builder.Configuration.AddJsonFile(“config.json”);
builder.Configuration.AddXmlFile(“config.xml”);
builder.Configuration.AddIniFile(“config.ini”);
Конфигурация из памяти
builder.Configuration.AddInMemoryCollection(new Dictionary<string, string>
{
{“name”, “Tom”},
{“age”, “37”}
});
Конфигурация из переменных среды
//в ASP.NET Core уже используется по умолчанию
builder.Configuration.AddEnvironmentVariables();
Конфигурация из аргументов командной строки (launchSettings.json)
используется по умолчанию
ASP.NET Кэширование MemoryCache
MemoryCache - позволяет сохранять данные в кэше в памяти.
//Регистрация сервиса IMemoryCache
builder.Services.AddMemoryCache();
- Использование через внедрение зависимостей:
cache.TryGetValue(id, out User? user);
cache.Set(user.Id, user, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(5)));
Распределенное кэширование c Redis
- Нужен сервер Redis
- Нужен пакет Microsoft.Extensions.Caching.StackExchangeRedis
//Добавление сервиса IDistributedCache
builder.Services.AddStackExchangeRedisCache(options => {
options.Configuration = “localhost”;
options.InstanceName = “local”;
});
//использование
var userString = await cache.GetStringAsync(id.ToString());
await cache.SetStringAsync(user.Id.ToString(), userString, new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(2)
});
ASP.NET Identity
ASP.NET Identity - встроенный провайдер проверки подлинности, позволяет пользователям создавать учетные записи (хранит их в БД), аутентифицироваться, использовать для входа учетные записи внешних провайдеров (Facebook, Google, Microsoft).
- Настройка сервисов Identity:
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();</ApplicationDbContext></IdentityUser>
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings
// Lockout settings
// User settings
});</IdentityOptions>
//подключение middleware
app.UseAuthentication();
app.UseAuthorization();
- Для регистрации/логина используется SignInManager
- Для управление ролями используется RoleManager и UserManager
MVC HTML-хелперы
HTML-хелперы - вспомогательные методы для генерации html-разметки.
Пример:
//метод расширения для IHtmlHelper
public static HtmlString CreateList(this IHtmlHelper html, string[] items)
{
string result = “<ul>”;
foreach (string item in items)
{
result = $”{result}<li>{item}</li>”;
}
result = $”{result}</ul>”;
return new HtmlString(result);
}
//использование:
<div>
@Html.CreateList(cities)
</div>
-
@foreach (var phone in phones)
{
- @phone }