ASP.NET Core Flashcards

1
Q
  1. Что означают модели MVC, Web Api, MVVM.
A
  1. MVC (Model-View-Controller)
    Model-View-Controller (MVC) — это архитектурный шаблон, разделяющий приложение на три основных компонента:
    * Model: Представляет данные и бизнес-логику. Модель отвечает за доступ к данным, обработку логики приложения и хранение состояния.
    * View: Отображает данные пользователю. Представление отвечает за визуализацию данных из модели и предоставляет пользовательский интерфейс.
    * Controller: Управляет пользовательским вводом и взаимодействует с моделью. Контроллер получает пользовательский запрос, обрабатывает его (взаимодействуя с моделью) и возвращает ответ в виде представления.
    Преимущества MVC:
    * Четкое разделение ответственности: Упрощает поддержку и масштабирование.
    * Тестируемость: Легче тестировать отдельные компоненты.
    * Масштабируемость: Приложение легче расширять и модифицировать.
    Пример: В веб-приложении с использованием MVC, пользовательский запрос на получение страницы может обрабатываться следующим образом:
  2. Controller получает запрос и вызывает метод в Model для получения данных.
  3. Model возвращает данные, которые Controller передает в View.
  4. View отображает данные пользователю.
  5. Web API
    Web API (Application Programming Interface) — это архитектурный стиль для создания HTTP-сервисов, предназначенных для взаимодействия между разными системами. В ASP.NET, Web API позволяет создавать RESTful веб-сервисы, которые могут быть использованы для обмена данными между клиентом и сервером.
    Ключевые особенности Web API:
    * HTTP методы: Использует стандартные HTTP методы, такие как GET, POST, PUT, DELETE.
    * Форматы данных: Поддерживает различные форматы данных, включая JSON и XML.
    * Кросс-платформенность: Подходит для взаимодействия с различными типами клиентов (веб-приложения, мобильные приложения, десктопные приложения).
    Пример: Для создания простого API в ASP.NET Core:
    [ApiController]
    [Route(“api/[controller]”)]
    public class ValuesController : ControllerBase
    {
    [HttpGet]
    public IEnumerable<string> Get()
    {
    return new string[] { "value1", "value2" };
    }</string>[HttpGet(“{id}”)]
    public string Get(int id)
    {
    return “value”;
    }
    }
  6. MVVM (Model-View-ViewModel)
    Model-View-ViewModel (MVVM) — это архитектурный паттерн, используемый в приложениях с пользовательским интерфейсом, таких как WPF (Windows Presentation Foundation), Xamarin, и некоторые веб-фреймворки. MVVM разделяет приложение на три компонента:
    * Model: Представляет данные и бизнес-логику, аналогично MVC.
    * View: Отображает данные и интерфейс пользователя.
    * ViewModel: Связывает View и Model. ViewModel обрабатывает данные, предоставляемые Model, и подготавливает их для отображения в View. Также обрабатывает команды и взаимодействует с Model.
    Преимущества MVVM:
    * Разделение интересов: Облегчает тестирование и повторное использование компонентов.
    * Двусторонняя привязка данных: ViewModel и View могут обмениваться данными через привязку, что упрощает работу с пользовательским интерфейсом.
    * Поддержка команд: Позволяет использовать команды для обработки действий пользователя, что улучшает организацию кода.
    Пример: В WPF-приложении, ViewModel может выглядеть следующим образом:
    public class MainViewModel : INotifyPropertyChanged
    {
    private string _name;
    public string Name
    {
    get { return _name; }
    set
    {
    _name = value;
    OnPropertyChanged(nameof(Name));
    }
    }public ICommand SaveCommand { get; }public MainViewModel()
    {
    SaveCommand = new RelayCommand(Save);
    }private void Save()
    {
    // Сохранить данные
    }public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    }
    Сравнение
    * MVC: Хорош для веб-приложений с четким разделением на контроллеры, модели и представления.
    * Web API: Ориентирован на создание HTTP сервисов и обмен данными между клиентом и сервером.
    * MVVM: Подходит для приложений с пользовательским интерфейсом, позволяя более эффективно связывать данные и пользовательский интерфейс, особенно в средах с поддержкой привязки данных.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Как вызывается конкретный метод контроллера при поступлении запроса “под капотом” (pipeline).
A

В ASP.NET Core процесс обработки запроса и вызова метода контроллера происходит в несколько этапов. Давайте разберёмся, как это работает “под капотом”:

  1. Приём запроса и Middleware
    Когда HTTP-запрос поступает в приложение ASP.NET Core, он сначала обрабатывается конвейером Middleware. Middleware — это компоненты, которые могут изменять запрос, обрабатывать его или передавать его следующему компоненту в конвейере.
    Процесс обработки запроса начинается так:
    * Middleware выполняются последовательно в порядке их регистрации в методе Configure класса Startup. Например, могут быть использованы Middleware для аутентификации, авторизации, обработки ошибок и так далее.
  2. Маршрутизация запроса
    После обработки запросов Middleware, запрос поступает в систему маршрутизации (routing), которая определяет, какому контроллеру и методу следует передать запрос. Основные шаги маршрутизации:
  3. Регистрируем маршруты: В Startup.cs, в методе Configure, маршруты конфигурируются с использованием метода UseRouting и UseEndpoints. Пример:

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: “default”,
pattern: “{controller=Home}/{action=Index}/{id?}”);
});
2. Маршрутизация: В момент, когда запрос поступает в систему маршрутизации, ASP.NET Core анализирует URL и сопоставляет его с зарегистрированными маршрутами. Это происходит в EndpointRoutingMiddleware. На основе сопоставления определяется конечная точка (endpoint), то есть контроллер и метод, которые будут обработаны.
3. Создание контроллера и вызов метода

После определения маршрута, система маршрутизации создаёт экземпляр соответствующего контроллера и вызывает нужный метод:
1. Создание контроллера: Используется механизм Dependency Injection для создания экземпляра контроллера. Все зависимости, указанные в конструкторе контроллера, внедряются автоматически.
2. Вызов метода: После создания экземпляра контроллера, вызывается метод, соответствующий действию маршрута. Параметры метода заполняются значениями из запроса. Например, параметры маршрута или строки запроса могут быть переданы в метод действия.
4. Обработка результата и Middleware
После того как метод контроллера выполнен и вернул результат (например, представление, JSON-данные, или перенаправление), результат обрабатывается и возвращается клиенту. Дополнительные Middleware могут быть использованы для обработки результата перед отправкой ответа клиенту.

Как запрос к “/Home/About” обрабатывается:
1. Middleware: Запрос обрабатывается через все зарегистрированные Middleware.
2. Маршрутизация: Система маршрутизации получает запрос “/Home/About”, сопоставляет его с маршрутом {controller=Home}/{action=Index}/{id?} и определяет, что запрос должен быть направлен в метод About контроллера Home.
3. Создание контроллера: ASP.NET Core создаёт экземпляр HomeController, используя Dependency Injection.
4. Вызов метода: Метод About() вызывается для обработки запроса.
5. Возврат результата: Результат метода About() (например, представление) возвращается клиенту.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. Как можно залогировать все ответы сервера.
A

Залогирование всех ответов сервера в ASP.NET Core можно организовать с помощью middleware. Middleware — это компонент, который обрабатывает запросы и ответы в конвейере обработки запросов, предоставляемом ASP.NET Core. В данном случае, мы будем использовать middleware для перехвата и логирования всех исходящих ответов.
Вот пошаговое руководство по созданию middleware для логирования ответов сервера:

  1. Создание Middleware для логирования ответов
    Создайте класс middleware, который будет перехватывать и логировать все ответы. Вот пример такого класса:
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    using System.IO;
    using System.Threading.Tasks;

public class ResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<ResponseLoggingMiddleware> _logger;</ResponseLoggingMiddleware>

public ResponseLoggingMiddleware(RequestDelegate next, ILogger<ResponseLoggingMiddleware> logger)
{
    _next = next;
    _logger = logger;
}

public async Task InvokeAsync(HttpContext context)
{
    // Создание временного потока для захвата ответа
    var originalBodyStream = context.Response.Body;
    using (var newBodyStream = new MemoryStream())
    {
        context.Response.Body = newBodyStream;

        // Продолжение обработки запроса
        await _next(context);

        // Перемещение указателя потока в начало
        newBodyStream.Seek(0, SeekOrigin.Begin);

        // Чтение ответа
        var responseBody = await new StreamReader(newBodyStream).ReadToEndAsync();

        // Логирование ответа
        _logger.LogInformation($"Response: {responseBody}");

        // Перезапись потока ответа
        newBodyStream.Seek(0, SeekOrigin.Begin);
        await newBodyStream.CopyToAsync(originalBodyStream);
    }
} } 2. Регистрация Middleware в приложении Теперь нужно зарегистрировать этот middleware в конвейере обработки запросов в методе Configure класса Startup: public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
// Добавляем ResponseLoggingMiddleware в конвейер обработки запросов
app.UseMiddleware<ResponseLoggingMiddleware>();

// Другие middleware
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
}); } 3. Настройка логирования Убедитесь, что у вас настроено логирование в вашем приложении. Например, в appsettings.json можно настроить уровень логирования: json Копировать код {   "Logging": {
"LogLevel": {
  "Default": "Information",
  "Microsoft": "Warning"
}   } } Объяснение кода 1.	Создание временного потока: o	Мы заменяем оригинальный поток ответа (context.Response.Body) на новый поток (newBodyStream), чтобы перехватить и сохранить ответ. 2.	Продолжение обработки запроса: o	Вызов _next(context) передаёт запрос следующему компоненту в конвейере обработки запросов. 3.	Чтение и логирование ответа: o	После того как остальные middleware завершили обработку, мы читаем ответ из newBodyStream, логируем его и затем копируем содержимое обратно в оригинальный поток ответа. 4.	Копирование ответа обратно: o	Мы возвращаем данные из newBodyStream в оригинальный поток (originalBodyStream), чтобы клиент получил полный ответ. Замечания *	Производительность: Будьте осторожны с производительностью при логировании больших ответов, так как это может замедлить обработку запросов. *	Безопасность: Убедитесь, что вы не логируете конфиденциальные данные, такие как пароли или персональная информация.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. Что такое middleware и когда они используются.
A

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

Основные концепции Middleware
1. Компоненты конвейера: Middleware компоненты выстраиваются в конвейер обработки запросов, где каждый компонент может либо завершить обработку запроса и сформировать ответ, либо передать запрос следующему компоненту в конвейере.
2. Вызов следующего Middleware: Каждое middleware может вызвать следующий компонент в конвейере, передавая запрос и возможность модификации ответа. Это осуществляется с помощью вызова _next(context), где _next представляет делегат для следующего компонента.
3. Обработка запросов и ответов: Middleware могут перехватывать и модифицировать как запросы (до передачи их контроллерам), так и ответы (до их отправки клиенту).

Примеры использования Middleware
1. Аутентификация и авторизация: Middleware может проверять, аутентифицирован ли пользователь, и имеет ли он права доступа к запрашиваемому ресурсу.
app.UseAuthentication();
app.UseAuthorization();
2. Логирование: Можно использовать middleware для логирования запросов и ответов.
public class RequestLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<RequestLoggingMiddleware> _logger;</RequestLoggingMiddleware>

public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)
{
    _next = next;
    _logger = logger;
}

public async Task InvokeAsync(HttpContext context)
{
    _logger.LogInformation("Request path: {Path}", context.Request.Path);
    await _next(context);
} } И регистрация в Startup: app.UseMiddleware<RequestLoggingMiddleware>(); 3.	Обработка ошибок: Middleware для обработки исключений и генерации пользовательских страниц ошибок. app.UseExceptionHandler("/Home/Error"); 4.	Кэширование: Middleware может использоваться для кэширования ответов и улучшения производительности. 5.	Сжатие данных: Middleware может сжимать ответ для уменьшения объема данных, передаваемых по сети. app.UseResponseCompression(); 6.	CORS (Cross-Origin Resource Sharing): Middleware для управления политиками доступа для кросс-доменных запросов. app.UseCors(builder =>
builder.AllowAnyOrigin()
       .AllowAnyMethod()
       .AllowAnyHeader());

Как работает Middleware
1. Конфигурация в Startup: Middleware конфигурируется в методе Configure класса Startup с использованием метода Use или UseMiddleware.
public void Configure(IApplicationBuilder app)
{
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
}); } 2.	Порядок обработки: Порядок регистрации middleware в конвейере имеет значение. Каждый middleware обрабатывает запрос и может передавать его следующему компоненту.

Создание собственного Middleware
Для создания собственного middleware, вы определяете класс с конструктором, принимающим RequestDelegate, и методом Invoke или InvokeAsync, который принимает HttpContext и возвращает Task. Пример:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<CustomMiddleware> _logger;</CustomMiddleware>

public CustomMiddleware(RequestDelegate next, ILogger<CustomMiddleware> logger)
{
    _next = next;
    _logger = logger;
}

public async Task InvokeAsync(HttpContext context)
{
    _logger.LogInformation("Custom Middleware executing.");
    await _next(context);
    _logger.LogInformation("Custom Middleware completed.");
} } И зарегистрируйте его в Startup: app.UseMiddleware<CustomMiddleware>();
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Middleware vs Filters
A

В ASP.NET Core как middleware, так и filters используются для обработки запросов и управления поведением приложений, но они предназначены для разных задач и используются в различных контекстах. Давайте разберём основные различия и случаи применения каждого из этих механизмов.

Middleware
Middleware — это компоненты конвейера обработки запросов и ответов, которые выполняются последовательно. Они могут обрабатывать запрос до того, как он достигнет контроллера, и модифицировать ответ до того, как он будет отправлен клиенту.
Основные характеристики Middleware:
* Процесс обработки запросов и ответов: Middleware выполняется для каждого запроса и ответа в конвейере обработки запросов.
* Глобальный уровень: Middleware применяется ко всем запросам и ответам в приложении. Например, аутентификация, авторизация, логирование, обработка ошибок и CORS.
* Порядок обработки: Порядок, в котором middleware регистрируются в Startup.cs, имеет значение. Middleware выполняются последовательно в том порядке, в котором они зарегистрированы.
Примеры использования:
* Логирование запросов и ответов
* Обработка исключений
* Аутентификация и авторизация
* Кэширование и сжатие данных
* Управление CORS (Cross-Origin Resource Sharing)

Пример создания Middleware:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<CustomMiddleware> _logger;</CustomMiddleware>

public CustomMiddleware(RequestDelegate next, ILogger<CustomMiddleware> logger)
{
    _next = next;
    _logger = logger;
}

public async Task InvokeAsync(HttpContext context)
{
    _logger.LogInformation("Processing request in custom middleware.");
    await _next(context);
    _logger.LogInformation("Request processed by custom middleware.");
} } И регистрация: app.UseMiddleware<CustomMiddleware>();

Фильтры
Фильтры — это компоненты, которые применяются к действиям контроллеров в ASP.NET Core MVC и Razor Pages. Они позволяют вмешиваться в выполнение действий контроллеров, изменять результаты и выполнять логику до и после выполнения действия.
Основные характеристики Filters:
* Контекст обработки: Filters применяются к запросам, которые направляются на контроллеры и действия, и не обрабатывают запросы на более низком уровне.
* Контроль на уровне действия: Filters могут применяться к отдельным контроллерам или действиям, а также могут быть глобальными или применяться к определённым областям.
* Типы фильтров: В ASP.NET Core существуют различные типы фильтров, такие как Action Filters, Result Filters, Exception Filters и Authorization Filters.

Примеры использования:
* Аутентификация и авторизация (перед выполнением действия)
* Логирование выполнения действий (до и после выполнения действия)
* Изменение результата (например, форматирование ответа)
* Обработка исключений (только для контроллеров и действий)
Пример создания Filter:
public class CustomActionFilter : IActionFilter
{
private readonly ILogger<CustomActionFilter> _logger;</CustomActionFilter>

public CustomActionFilter(ILogger<CustomActionFilter> logger)
{
    _logger = logger;
}

public void OnActionExecuting(ActionExecutingContext context)
{
    _logger.LogInformation("Action is executing.");
}

public void OnActionExecuted(ActionExecutedContext context)
{
    _logger.LogInformation("Action executed.");
} } И регистрация: services.AddControllersWithViews(options => {
options.Filters.Add<CustomActionFilter>(); });

Основные различия
1. Уровень применения:
o Middleware: Работает на уровне HTTP-запросов и ответов и применяется ко всем запросам и ответам в приложении.
o Filters: Работают на уровне действий контроллеров и применяются только к запросам, направляемым на контроллеры и действия.
2. Порядок и место исполнения:
o Middleware: Выполняется до достижения контроллера и после выполнения контроллера, на уровне всего приложения.
o Filters: Выполняются до и после выполнения метода действия, в контексте MVC.
3. Область применения:
o Middleware: Широкое применение, подходит для общих задач, таких как аутентификация, обработка ошибок, логирование и другие аспекты, которые должны быть применены ко всем запросам.
o Filters: Более специфичные задачи, связанные с действиями контроллеров, такие как изменение поведения выполнения действия или обработка результатов.
В конечном итоге, выбор между middleware и filters зависит от того, на каком уровне и как вы хотите вмешиваться в обработку запросов и ответов. Middleware хорошо подходит для глобальных задач, а filters — для задач, связанных непосредственно с выполнением действий контроллеров и изменением результатов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Очерёдность middleware
A

Очерёдность middleware в ASP.NET Core играет ключевую роль в том, как обрабатываются HTTP-запросы и ответы. Порядок регистрации middleware в конвейере обработки запросов определяет последовательность их выполнения, что может существенно повлиять на поведение вашего приложения.

Как работает Middleware
1. Обработка запроса:
o Когда HTTP-запрос поступает в приложение, он проходит через цепочку middleware в том порядке, в котором они зарегистрированы. Каждый middleware может обработать запрос, изменить его, передать следующему компоненту в конвейере или завершить обработку.
2. Обработка ответа:
o После того, как запрос достигнет конечного компонента (например, контроллера), ответ возвращается обратно через ту же цепочку middleware, но в обратном порядке. Каждый middleware может изменить ответ перед его отправкой клиенту.

Пример и объяснение
Рассмотрим пример с несколькими middleware, зарегистрированными в разном порядке в методе Configure класса Startup:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<FirstMiddleware>();
app.UseMiddleware<SecondMiddleware>();
app.UseMiddleware<ThirdMiddleware>();</ThirdMiddleware></SecondMiddleware></FirstMiddleware>

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
}); } *	FirstMiddleware: Этот middleware будет первым в конвейере и будет выполнять свою логику до того, как запрос достигнет SecondMiddleware и ThirdMiddleware. *	SecondMiddleware: Этот middleware будет выполняться после FirstMiddleware, но до ThirdMiddleware. *	ThirdMiddleware: Этот middleware будет последним в конвейере обработки запросов. Порядок обработки запроса: 1.	Запрос сначала попадает в FirstMiddleware. 2.	Затем передаётся в SecondMiddleware. 3.	Далее передаётся в ThirdMiddleware. 4.	После выполнения ThirdMiddleware запрос направляется к конечной точке (например, контроллеру). Порядок обработки ответа: 1.	Ответ из конечной точки сначала возвращается в ThirdMiddleware. 2.	Затем возвращается в SecondMiddleware. 3.	И наконец, в FirstMiddleware.

Важность правильного порядка
1. Аутентификация и авторизация:
o Обычно аутентификация и авторизация должны быть расположены как можно выше в конвейере, чтобы защитить все последующие middleware и контроллеры. Например:
app.UseAuthentication();
app.UseAuthorization();
2. Обработка ошибок:
o Middleware для обработки ошибок (UseExceptionHandler или UseDeveloperExceptionPage) должен быть размещён в начале конвейера, чтобы перехватывать все исключения, возникшие в последующих middleware.
app.UseExceptionHandler(“/Home/Error”);
3. Логирование и трассировка:
o Логирование запросов и ответов часто размещается в начале и в конце конвейера, чтобы получить полное представление о запросах и ответах.
app.UseMiddleware<RequestLoggingMiddleware>();
4. Кэширование:
o Кэширование должно быть размещено до middleware, которые могут изменить данные, которые вы хотите закэшировать.
5. Статические файлы:
o Middleware для обслуживания статических файлов (например, UseStaticFiles) обычно регистрируется перед другими middleware, которые могут обрабатывать запросы, направленные к статическим ресурсам.</RequestLoggingMiddleware>

Примеры правильного порядка
1. Аутентификация и авторизация должны быть выше, чем обработка запросов:
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
2. Обработка ошибок должна быть первой:
app.UseExceptionHandler(“/Home/Error”);
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

Заключение
Правильная очерёдность middleware критически важна для корректной работы приложения. Ошибки в порядке регистрации могут привести к неправильному поведению, уязвимостям в безопасности или другим проблемам. Всегда учитывайте, как каждый middleware взаимодействует с другими компонентами, чтобы обеспечить правильную обработку запросов и ответов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Объект HttpContext.
A

В ASP.NET Core объект HttpContext представляет собой основной механизм для взаимодействия с HTTP-запросами и ответами в рамках приложения. Он предоставляет доступ ко всем аспектам текущего HTTP-запроса и ответа, а также к дополнительной информации и функциональности, необходимой для обработки запросов.

Основные компоненты HttpContext
1. Request:
o Представляет HTTP-запрос.
o Свойства включают информацию о методе запроса (Method), URL (RequestUri), заголовках (Headers), теле запроса (Body), строке запроса (QueryString), и многое другое.
o Примеры:
var method = context.Request.Method;
var path = context.Request.Path;
var queryString = context.Request.QueryString;
2. Response:
o Представляет HTTP-ответ.
o Свойства включают код состояния ответа (StatusCode), заголовки (Headers), и метод для записи данных в тело ответа (WriteAsync).
o Примеры:
context.Response.StatusCode = 200;
await context.Response.WriteAsync(“Hello, world!”);
3. Session:
o Позволяет хранить данные между запросами для одного и того же пользователя.
o Сессионные данные хранятся в сервере и ассоциированы с уникальным идентификатором сеанса.
o Примеры:
context.Session.SetString(“key”, “value”);
var value = context.Session.GetString(“key”);
4. User:
o Представляет информацию об аутентифицированном пользователе.
o Объект типа ClaimsPrincipal, который содержит информацию о пользователе, такую как идентификатор, роли, и другие утверждения.
o Примеры:
var isAuthenticated = context.User.Identity.IsAuthenticated;
var username = context.User.Identity.Name;
5. Items:
o Позволяет хранить данные, доступные только в рамках текущего запроса.
o Это коллекция ключ-значение, которая может быть использована для передачи данных между middleware или между контроллерами и middleware.
o Примеры:
context.Items[“key”] = “value”;
var value = context.Items[“key”] as string;
6. Features:
o Позволяет доступ к дополнительным функциям и расширениям, предоставляемым сервером и другими компонентами.
o Используется для получения и работы с дополнительными возможностями, такими как серверные функции или дополнительные компоненты обработки запросов.

Пример использования HttpContext в Middleware

public class CustomMiddleware
{
private readonly RequestDelegate _next;

public CustomMiddleware(RequestDelegate next)
{
    _next = next;
}

public async Task InvokeAsync(HttpContext context)
{
    // Логирование информации о запросе
    Console.WriteLine($"Request Path: {context.Request.Path}");
    
    // Изменение ответа
    context.Response.Headers.Add("X-Custom-Header", "Value");

    // Передача управления следующему middleware
    await _next(context);
} } Пример использования HttpContext в контроллере

public class HomeController : Controller
{
public IActionResult Index()
{
// Получение значения из запроса
var path = HttpContext.Request.Path;

    // Установка значения в сессию
    HttpContext.Session.SetString("key", "value");

    // Получение информации о пользователе
    var username = HttpContext.User.Identity.Name;

    return View();
} } Пример использования HttpContext в Razor Pages

public class IndexModel : PageModel
{
public void OnGet()
{
// Логирование пути запроса
var path = HttpContext.Request.Path;

    // Установка значения в сессию
    HttpContext.Session.SetString("key", "value");

    // Получение информации о пользователе
    var username = HttpContext.User.Identity.Name;
} }

Особенности и предостережения
1. Время жизни: HttpContext существует только в рамках обработки текущего запроса. Не сохраняйте его ссылки в длительных объектах или статических переменных, так как это может привести к ошибкам.
2. Асинхронность: При работе с HttpContext в асинхронных методах убедитесь, что вы правильно обрабатываете асинхронные вызовы и не блокируете поток выполнения.
3. Зависимости: Если вы используете HttpContext в зависимости от DI (Dependency Injection), убедитесь, что он доступен и корректно используется в контексте текущего запроса.
Заключение
HttpContext — это центральный компонент для работы с HTTP-запросами и ответами в ASP.NET Core. Он предоставляет доступ ко всей необходимой информации о запросе и ответе, а также к сессионным данным и информации о пользователе. Понимание того, как использовать HttpContext эффективно, является важным для разработки веб-приложений в ASP.NET Core.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. HttpClient и HttpClientFactory (Retry policy)
A

В ASP.NET Core HttpClient используется для отправки HTTP-запросов и получения ответов от удалённых ресурсов. Однако неправильное использование HttpClient может привести к проблемам, таким как истощение портов, особенно в средах с высокой нагрузкой. Для решения этой проблемы и управления запросами более эффективно, используется HttpClientFactory, который предоставляет возможности для создания и конфигурации HttpClient экземпляров.

HttpClient
HttpClient — это класс, предоставляющий методы для отправки HTTP-запросов и получения HTTP-ответов от удалённых ресурсов. Он является частью пространства имён System.Net.Http.
Основные характеристики HttpClient:
* Создание экземпляров: Экземпляры HttpClient могут быть созданы и использованы для отправки запросов.
* Управление соединениями: HttpClient автоматически управляет соединениями, включая установление соединений, повторные попытки и освобождение ресурсов.
Пример использования HttpClient:
public async Task<string> GetDataAsync(string url)
{
using (var httpClient = new HttpClient())
{
HttpResponseMessage response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}</string>

Проблемы с использованием HttpClient
1. Утечка сокетов: Если создавать новые экземпляры HttpClient для каждого запроса, это может привести к утечке сокетов из-за неэффективного управления ресурсами.
2. Проблемы с производительностью: Частое создание и уничтожение HttpClient объектов может негативно сказаться на производительности приложения.

HttpClientFactory
HttpClientFactory — это механизм, введённый в ASP.NET Core 2.1 для решения проблем, связанных с созданием и управлением экземплярами HttpClient. Он предоставляет централизованное место для конфигурации и создания HttpClient экземпляров.
Преимущества HttpClientFactory:
* Переиспользование соединений: Управляет жизненным циклом HttpClient, что позволяет переиспользовать соединения и избегать утечек сокетов.
* Конфигурация: Позволяет настраивать HttpClient экземпляры с использованием именованных и типизированных конфигураций.
* Политики повторных попыток: Поддерживает реализацию политик повторных попыток и обработки ошибок с помощью Polly.
Настройка HttpClientFactory:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
}
Создание именованного клиента:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient(“MyClient”, client =>
{
client.BaseAddress = new Uri(“https://api.example.com/”);
client.DefaultRequestHeaders.Add(“Accept”, “application/json”);
});
}
Использование именованного клиента:
public class MyService
{
private readonly HttpClient _httpClient;

public MyService(IHttpClientFactory httpClientFactory)
{
    _httpClient = httpClientFactory.CreateClient("MyClient");
}

public async Task<string> GetDataAsync()
{
    var response = await _httpClient.GetAsync("/data");
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
} }

Политики повторных попыток с Polly
HttpClientFactory интегрируется с библиотекой Polly для реализации политик повторных попыток и обработки ошибок.
Настройка политик повторных попыток:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient(“RetryClient”)
.AddTransientHttpErrorPolicy(policyBuilder => policyBuilder
.WaitAndRetryAsync(
3,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
)
);
}
Использование клиента с политикой повторных попыток:
public class MyService
{
private readonly HttpClient _httpClient;

public MyService(IHttpClientFactory httpClientFactory)
{
    _httpClient = httpClientFactory.CreateClient("RetryClient");
}

public async Task<string> GetDataAsync()
{
    var response = await _httpClient.GetAsync("/data");
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
} }

Заключение
* HttpClient предоставляет базовый функционал для отправки HTTP-запросов и получения ответов. Однако его неправильное использование может привести к проблемам с ресурсами и производительностью.
* HttpClientFactory решает проблемы с управлением жизненным циклом HttpClient, обеспечивая переиспользование соединений и интеграцию с политиками повторных попыток и обработки ошибок через Polly.
Использование HttpClientFactory рекомендуется в ASP.NET Core приложениях для эффективного управления HttpClient и обеспечения надежности и производительности сетевых запросов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly