200 вопросов по ASP.NET
200 вопросов по ASP.NET
Основы ASP.NET и ASP.NET Core
Вопрос
Что такое ASP.NET?
Ответ
ASP.NET — это серверная платформа от Microsoft для создания веб-приложений и веб-API. Она предоставляет набор инструментов, библиотек и среду выполнения на основе .NET для разработки динамических веб-страниц, сервисов и приложений.
Вопрос
Что такое ASP.NET Core?
Ответ
ASP.NET Core — это кроссплатформенный, высокопроизводительный фреймворк с открытым исходным кодом для создания современных облачных и интернет-приложений. Он работает на Windows, Linux и macOS и не зависит от полной версии .NET Framework.
Вопрос
Какие основные преимущества ASP.NET Core перед классическим ASP.NET?
Ответ
ASP.NET Core обеспечивает кроссплатформенность, модульную архитектуру, встроенную поддержку внедрения зависимостей, высокую производительность, унифицированную модель для веб-страниц и API, а также гибкую систему конфигурации без зависимости от Web.config.
Вопрос
Что такое Kestrel?
Ответ
Kestrel — это кроссплатформенный веб-сервер с открытым исходным кодом, разработанный специально для ASP.NET Core. Он используется по умолчанию и может работать как автономный сервер или за обратным прокси, таким как IIS, Nginx или Apache.
Вопрос
Что такое IIS и как он связан с ASP.NET Core?
Ответ
IIS (Internet Information Services) — это веб-сервер от Microsoft для Windows. В ASP.NET Core он может использоваться как обратный прокси перед Kestrel, обеспечивая дополнительные функции безопасности, управления и балансировки нагрузки.
Вопрос
Что такое middleware в ASP.NET Core?
Ответ
Middleware — это компоненты программного обеспечения, обрабатывающие HTTP-запросы и ответы в конвейере приложения. Каждый middleware может выполнять логику до и после вызова следующего компонента в цепочке.
Вопрос
Как зарегистрировать middleware в приложении ASP.NET Core?
Ответ
Middleware регистрируется в методе Configure класса Startup или в основном файле программы через метод Use. Порядок регистрации определяет порядок выполнения в конвейере.
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(...);
Вопрос
Что такое Startup.cs и нужен ли он в новых версиях ASP.NET Core?
Ответ
Файл Startup.cs содержал методы ConfigureServices и Configure для настройки сервисов и конвейера запросов. Начиная с .NET 6, он заменён минимальным хостинг-моделью с использованием файла Program.cs, где конфигурация задаётся напрямую.
Вопрос
Что такое хостинг в контексте ASP.NET Core?
Ответ
Хостинг — это процесс управления жизненным циклом приложения, включая запуск, остановку, настройку зависимостей и конфигурацию. ASP.NET Core использует универсальный хост (IHost) для всех типов приложений.
Вопрос
Какие типы хостов существуют в ASP.NET Core?
Ответ
Существует универсальный хост (Generic Host), который поддерживает все типы приложений, включая веб, фоновые службы и консольные приложения. Ранее использовался веб-хост (Web Host), но он устарел.
Модель приложения и жизненный цикл
Вопрос
Опишите жизненный цикл HTTP-запроса в ASP.NET Core.
Ответ
Запрос поступает в Kestrel, проходит через цепочку middleware (например, маршрутизация, аутентификация), достигает конечной точки (например, контроллера или Razor Page), обрабатывается, и ответ возвращается через ту же цепочку в обратном порядке.
Вопрос
Что такое конечная точка (endpoint)?
Ответ
Конечная точка — это логический обработчик запроса, связанный с определённым маршрутом. Это может быть метод контроллера, Razor Page, делегат gRPC или другая пользовательская логика.
Вопрос
Как работает маршрутизация в ASP.NET Core?
Ответ
Маршрутизация сопоставляет входящий URL с соответствующей конечной точкой. Поддерживаются соглашения о маршрутах (conventional routing) и атрибутивная маршрутизация (attribute routing).
Вопрос
Приведите пример атрибутивной маршрутизации.
Ответ
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult Get(int id)
{
return Ok(new { Id = id, Name = "Product" });
}
}
Этот контроллер отвечает на запросы вида /api/products/5.
Вопрос
Что такое контроллер в ASP.NET Core MVC?
Ответ
Контроллер — это класс, наследуемый от Controller или ControllerBase, который обрабатывает входящие HTTP-запросы и возвращает результаты действий (например, представления или JSON).
Внедрение зависимостей (Dependency Injection)
Вопрос
Поддерживает ли ASP.NET Core внедрение зависимостей «из коробки»?
Ответ
Да, ASP.NET Core включает встроенный контейнер внедрения зависимостей, поддерживающий регистрацию и разрешение сервисов с различными временами жизни.
Вопрос
Какие времена жизни сервисов поддерживаются в ASP.NET Core?
Ответ
Поддерживаются три времени жизни:
- Transient — создаётся новый экземпляр при каждом запросе.
- Scoped — один экземпляр на область (обычно на HTTP-запрос).
- Singleton — один экземпляр на всё приложение.
Вопрос
Как зарегистрировать сервис с временем жизни Scoped?
Ответ
builder.Services.AddScoped<IMyService, MyService>();
Вопрос
Можно ли использовать внедрение зависимостей в middleware?
Ответ
Да, если middleware зарегистрировано через фабрику (UseMiddleware или IMiddleware), зависимости могут внедряться через конструктор. Для scoped-сервисов middleware должно быть активировано на каждый запрос.
Вопрос
Что произойдёт, если внедрить scoped-сервис в singleton?
Ответ
Это приведёт к ошибке времени выполнения или неправильному поведению, так как scoped-сервис будет захвачен на весь срок жизни singleton, что нарушает его семантику.
Конфигурация и параметры
Вопрос
Как ASP.NET Core загружает конфигурацию?
Ответ
Конфигурация загружается из различных источников: файлов (appsettings.json, XML, INI), переменных окружения, аргументов командной строки и пользовательских провайдеров.
Вопрос
Как получить значение из конфигурации в коде?
Ответ
Через интерфейс IConfiguration:
var connectionString = Configuration.GetConnectionString("Default");
// или
var value = Configuration["MySection:MyKey"];
Вопрос
Что такое Options Pattern?
Ответ
Options Pattern — это способ привязки конфигурационных данных к строго типизированным классам. Он позволяет инкапсулировать настройки и внедрять их через DI.
Вопрос
Как использовать Options Pattern?
Ответ
// Класс настроек
public class SmtpSettings { public string Host { get; set; } }
// Регистрация
builder.Services.Configure<SmtpSettings>(Configuration.GetSection("Smtp"));
// Использование
public class EmailService
{
private readonly SmtpSettings _settings;
public EmailService(IOptions<SmtpSettings> options) =>
_settings = options.Value;
}
Вопрос
Как обновлять настройки без перезапуска приложения?
Ответ
Используется IOptionsSnapshot<T> для перезагрузки настроек на каждый запрос или IOptionsMonitor<T> для реактивного отслеживания изменений.
Безопасность
Вопрос
Как реализуется аутентификация в ASP.NET Core?
Ответ
Аутентификация реализуется через схемы аутентификации (например, Cookie, JWT Bearer) и middleware UseAuthentication. Она проверяет подлинность пользователя на основе учётных данных.
Вопрос
Как реализуется авторизация в ASP.NET Core?
Ответ
Авторизация проверяет, имеет ли аутентифицированный пользователь право доступа к ресурсу. Используется middleware UseAuthorization и атрибуты [Authorize].
Вопрос
Что делает атрибут [Authorize]?
Ответ
Атрибут [Authorize] ограничивает доступ к контроллеру или действию только аутентифицированным пользователям. Можно указывать роли или политики.
Вопрос
Как настроить JWT-аутентификацию?
Ответ
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
// ... другие параметры
};
});
Вопрос
Что такое политики авторизации?
Ответ
Политики авторизации — это именованные правила, определяющие требования к пользователю (например, наличие определённого клейма). Они регистрируются в AddAuthorization.
Работа с данными
Вопрос
Как интегрировать Entity Framework Core в ASP.NET Core?
Ответ
Регистрацией контекста через AddDbContext:
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")));
Вопрос
Какие шаблоны проектирования рекомендуются для работы с данными в ASP.NET Core?
Ответ
Рекомендуются шаблоны Repository и Unit of Work для абстракции доступа к данным и управления транзакциями.
Вопрос
Что такое миграции в Entity Framework Core?
Ответ
Миграции — это механизм управления изменениями схемы базы данных с помощью кода. Они позволяют применять и откатывать изменения структуры БД.
Вопрос
Как выполнить миграцию при старте приложения?
Ответ
Через IDbContextFactory или в Program.cs:
using var scope = app.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Database.Migrate();
Вопрос
Как предотвратить SQL-инъекции в ASP.NET Core?
Ответ
Использованием параметризованных запросов через Entity Framework Core или Dapper, а не конкатенацией строк SQL.
Веб-API и сериализация
Вопрос
Как создать RESTful API в ASP.NET Core?
Ответ
Созданием контроллера, унаследованного от ControllerBase, с атрибутами [ApiController] и HTTP-глаголами ([HttpGet], [HttpPost] и т.д.).
Вопрос
Что делает атрибут [ApiController]?
Ответ
Он включает поведения, характерные для API: автоматическую проверку модели, привязку источника, обработку ошибок и форматирование ответов.
Вопрос
Как настроить сериализацию JSON в ASP.NET Core?
Ответ
Через AddJsonOptions:
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});
Вопрос
Как вернуть ошибку 400 при невалидной модели?
Ответ
При наличии [ApiController] фреймворк автоматически возвращает 400 Bad Request, если ModelState.IsValid == false.
Вопрос
Как реализовать глобальную обработку исключений?
Ответ
С помощью middleware UseExceptionHandler или кастомного middleware, перехватывающего необработанные исключения и возвращающего структурированный ответ.
Производительность и масштабируемость
Вопрос
Как включить кэширование ответов?
Ответ
С помощью атрибута [ResponseCache]:
[ResponseCache(Duration = 60)]
public IActionResult Get() => Ok(data);
Вопрос
Что такое распределённое кэширование и как его использовать?
Ответ
Распределённое кэширование хранит данные вне процесса приложения (например, в Redis). Регистрируется через AddStackExchangeRedisCache и используется через IDistributedCache.
Вопрос
Как уменьшить размер сборки публикуемого приложения?
Ответ
Использованием самодостаточной публикации с обрезанием неиспользуемых сборок (PublishTrimmed=true) и AOT-компиляцией (в .NET 8+).
Вопрос
Что такое Health Checks в ASP.NET Core?
Ответ
Health Checks — это механизм проверки работоспособности компонентов приложения (БД, внешние сервисы). Регистрируется через AddHealthChecks и доступен по эндпоинту.
Вопрос
Как реализовать пагинацию в API?
Ответ
Принимая параметры page и pageSize, применяя .Skip() и .Take() к запросу:
var items = dbContext.Products
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
Тестирование и отладка
Вопрос
Как протестировать контроллер ASP.NET Core?
Ответ
С помощью xUnit/NUnit и Moq, создавая экземпляр контроллера с моками зависимостей и вызывая его методы напрямую.
Вопрос
Как протестировать middleware?
Ответ
Созданием тестового HttpContext, моков зависимостей и вызовом метода Invoke или InvokeAsync middleware.
Вопрос
Как включить подробные ошибки в режиме разработки?
Ответ
Middleware UseDeveloperExceptionPage() показывает детали исключений в среде Development.
Вопрос
Как логировать события в ASP.NET Core?
Ответ
Через встроенный интерфейс ILogger<T>, внедряемый в классы. Логирование настраивается в appsettings.json или программно.
Вопрос
Какие уровни логирования поддерживаются?
Ответ
Поддерживаются уровни: Trace, Debug, Information, Warning, Error, Critical.
Расширенные возможности ASP.NET Core: фоновые задачи, сигналы и события
Вопрос
Что такое фоновые службы (Background Services) в ASP.NET Core?
Ответ
Фоновые службы — это долгоживущие задачи, выполняемые в фоновом потоке приложения. Они реализуются через интерфейсы IHostedService или базовый класс BackgroundService.
Вопрос
Как зарегистрировать фоновую службу?
Ответ
С помощью метода AddHostedService:
builder.Services.AddHostedService<EmailProcessingService>();
Вопрос
Когда следует использовать BackgroundService, а не IHostedService?
Ответ
BackgroundService предоставляет удобную обёртку с методом ExecuteAsync, упрощающим управление жизненным циклом. Он предпочтителен для большинства сценариев периодической или длительной фоновой работы.
Вопрос
Как корректно остановить фоновую службу при завершении приложения?
Ответ
Метод StopAsync вызывается хостом при завершении. Внутри ExecuteAsync рекомендуется использовать CancellationToken для реакции на запрос отмены.
Вопрос
Что такое каналы (Channels) и как они применяются в фоновых задачах?
Ответ
Каналы — это потокобезопасные очереди для передачи данных между производителями и потребителями. Они полезны для декуплирования получения и обработки сообщений в фоновых службах.
SignalR и реальное время
Вопрос
Что такое SignalR?
Ответ
SignalR — это библиотека для добавления функциональности реального времени в веб-приложения, позволяющая серверу мгновенно отправлять сообщения клиентам.
Вопрос
Какие транспорты использует SignalR?
Ответ
SignalR автоматически выбирает лучший доступный транспорт: WebSocket (предпочтительно), Server-Sent Events или Long Polling.
Вопрос
Как создать хаб SignalR?
Ответ
Хаб наследуется от класса Hub:
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
Вопрос
Как подключить SignalR в приложении?
Ответ
Регистрацией сервисов и маршрутов:
builder.Services.AddSignalR();
app.MapHub<ChatHub>("/chathub");
Вопрос
Как авторизовать подключение к хабу SignalR?
Ответ
Подключение наследует контекст аутентификации HTTP-запроса. Для JWT требуется передавать токен в строке запроса или заголовке при установке соединения на клиенте.
gRPC в ASP.NET Core
Вопрос
Что такое gRPC?
Ответ
gRPC — это высокопроизводительный RPC-фреймворк от Google, использующий Protocol Buffers для сериализации и HTTP/2 для транспорта.
Вопрос
Как включить поддержку gRPC в ASP.NET Core?
Ответ
Установкой пакета Grpc.AspNetCore и регистрацией:
builder.Services.AddGrpc();
app.MapGrpcService<GreeterService>();
Вопрос
Как определить gRPC-сервис?
Ответ
Созданием .proto-файла с контрактом и генерацией кода. Серверная реализация наследует сгенерированный базовый класс.
Вопрос
Поддерживает ли gRPC потоковую передачу?
Ответ
Да, gRPC поддерживает одностороннюю, двустороннюю и серверную потоковую передачу через ключевое слово stream в .proto.
Вопрос
Как обрабатывать ошибки в gRPC?
Ответ
Выбросом исключения RpcException с кодом состояния и сообщением:
throw new RpcException(new Status(StatusCode.NotFound, "User not found"));
Микросервисы и распределённые системы
Вопрос
Как ASP.NET Core поддерживает разработку микросервисов?
Ответ
Через лёгковесность, встроенную поддержку контейнеризации, health checks, конфигурацию из внешних источников, и интеграцию с системами обнаружения служб.
Вопрос
Что такое API Gateway и как его реализовать с ASP.NET Core?
Ответ
API Gateway — это единая точка входа для клиентов, маршрутизирующая запросы к микросервисам. Может быть реализован с помощью YARP (Yet Another Reverse Proxy) от Microsoft.
Вопрос
Как обеспечить отказоустойчивость при вызове другого сервиса?
Ответ
Использованием библиотеки Polly для реализации политик повторных попыток, прерывания цепи (circuit breaker) и таймаутов.
Вопрос
Как передавать контекст трассировки между микросервисами?
Ответ
Через заголовки traceparent и tracestate, соответствующие стандарту W3C Trace Context. ASP.NET Core автоматически поддерживает их при использовании Activity.
Вопрос
Что такое Dapr и как он связан с ASP.NET Core?
Ответ
Dapr — это портативная среда выполнения для построения микросервисов. ASP.NET Core может взаимодействовать с ней через HTTP или gRPC для использования компонентов: публикации/подписки, состояния, секретов.
Безопасность: продвинутые темы
Вопрос
Как защититься от CSRF в ASP.NET Core?
Ответ
Использованием токенов антиподделки через атрибут [ValidateAntiForgeryToken] и тег-хелпер asp-antiforgery в формах Razor Pages или MVC.
Вопрос
Как настроить CORS?
Ответ
Регистрацией политики:
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowFrontend", policy =>
policy.WithOrigins("https://example.com")
.AllowAnyHeader()
.AllowAnyMethod());
});
app.UseCors("AllowFrontend");
Вопрос
Как предотвратить утечку информации через заголовки?
Ответ
Удалением или переопределением заголовков, таких как Server, через middleware:
app.Use(async (context, next) =>
{
context.Response.OnStarting(() =>
{
context.Response.Headers.Remove("Server");
return Task.CompletedTask;
});
await next();
});
Вопрос
Что такое SameSite cookies и как их настроить?
Ответ
SameSite — это атрибут cookie, ограничивающий их отправку в кросс-сайтовых запросах. Настраивается в CookieAuthenticationOptions или AddJwtBearer.
Вопрос
Как реализовать двухфакторную аутентификацию (2FA)?
Ответ
С использованием библиотеки ASP.NET Core Identity, которая поддерживает TOTP (временные одноразовые пароли) через приложения-аутентификаторы.
Архитектурные подходы
Вопрос
Что такое Clean Architecture и как применить её в ASP.NET Core?
Ответ
Clean Architecture — это подход с чётким разделением слоёв: Presentation, Application, Domain, Infrastructure. В ASP.NET Core Presentation — это контроллеры, Application — команды и обработчики, Domain — сущности и интерфейсы, Infrastructure — реализации (БД, внешние сервисы).
Вопрос
Что такое CQRS?
Ответ
CQRS (Command Query Responsibility Segregation) — это паттерн, разделяющий операции изменения состояния (команды) и операции чтения (запросы) на разные модели.
Вопрос
Как реализовать CQRS в ASP.NET Core?
Ответ
С помощью библиотеки MediatR, где команды и запросы представлены как классы, а обработчики — как реализации IRequestHandler<T>.
Вопрос
Что такое MediatR?
Ответ
MediatR — это библиотека для реализации паттернов Mediator и CQRS в .NET-приложениях, упрощающая декомпозицию логики и внедрение сквозных задач (например, логирование, валидация).
Вопрос
Как интегрировать валидацию в MediatR?
Ответ
Созданием поведения (IPipelineBehavior) для автоматической проверки моделей команд/запросов с использованием FluentValidation.
Тестирование и наблюдаемость
Вопрос
Как писать интеграционные тесты для ASP.NET Core API?
Ответ
Используется класс WebApplicationFactory<T>, который запускает приложение в изолированном контексте. С его помощью создаётся HttpClient для выполнения запросов к API, а зависимости могут быть заменены на моки через переопределение ConfigureWebHost.
Вопрос
Что такое TestServer и когда его использовать?
Ответ
TestServer — это лёгковесный сервер, позволяющий тестировать middleware и конвейер без запуска реального Kestrel. Он полезен для модульного тестирования компонентов уровня хостинга.
Вопрос
Как реализовать логирование в тестах?
Ответ
Через внедрение ILogger<T> и использование NullLogger<T> или моков. Для интеграционных тестов можно подключить провайдер логов в WebApplicationFactory.
Вопрос
Как отслеживать метрики производительности в ASP.NET Core?
Ответ
С помощью OpenTelemetry или встроенных средств: System.Diagnostics.Activity, EventCounter, а также интеграции с Prometheus и Grafana через Prometheus.AspNetCore.
Вопрос
Что такое Application Insights и как его подключить?
Ответ
Application Insights — это сервис телеметрии от Azure. Подключается через пакет Microsoft.ApplicationInsights.AspNetCore и метод AddApplicationInsightsTelemetry.
Расширенная маршрутизация и привязка моделей
Вопрос
Как создать собственный провайдер маршрутизации?
Ответ
Реализацией интерфейса IEndpointDataSource или наследованием от EndpointDataSource. Это позволяет динамически генерировать маршруты во время выполнения.
Вопрос
Что такое модельная привязка (model binding)?
Ответ
Механизм автоматического преобразования входящих данных HTTP-запроса (из формы, JSON, строки запроса) в объекты .NET-типов.
Вопрос
Как настроить кастомную привязку модели?
Ответ
Созданием класса, реализующего IModelBinder, и регистрацией его через IServiceCollection.Configure<MvcOptions>(options => options.ModelBinderProviders.Insert(0, ...)).
Вопрос
Что делает атрибут [FromBody]?
Ответ
Указывает, что параметр действия должен быть десериализован из тела запроса (обычно JSON или XML).
Вопрос
Как обрабатывать ошибки валидации модели вручную?
Ответ
Проверкой свойства ModelState.IsValid в контроллере и возвратом BadRequest(ModelState) при наличии ошибок.
Безопасность: продвинутые практики
Вопрос
Как реализовать rate limiting в ASP.NET Core?
Ответ
С помощью пакета AspNetCoreRateLimit или встроенного механизма в .NET 7+: builder.Services.AddRateLimiter(options => options.AddFixedWindowLimiter(...)).
Вопрос
Что такое Content Security Policy (CSP) и как её применить?
Ответ
CSP — это механизм защиты от XSS, ограничивающий источники загружаемых ресурсов. Настраивается через middleware, добавляющий заголовок Content-Security-Policy.
Вопрос
Как защитить API от overposting и underposting?
Ответ
Использованием DTO с чётко определёнными полями, а не прямой привязкой к доменным сущностям. Также применяется атрибут [Bind] для явного указания разрешённых свойств.
Вопрос
Что такое HSTS и как его включить?
Ответ
HTTP Strict Transport Security — заголовок, заставляющий браузер использовать только HTTPS. Включается через middleware UseHsts() и требует HTTPS.
Вопрос
Как предотвратить утечку токена через логи?
Ответ
Настройкой сериализатора логов на фильтрацию чувствительных полей или использованием структурированного логирования с маскировкой значений.
Производительность и оптимизация
Вопрос
Как минимизировать аллокации в hot path?
Ответ
Использованием Span<T>, MemoryPool<T>, избеганием замыканий в циклах, кэшированием делегатов и повторным использованием объектов через пулы.
Вопрос
Что такое response compression и как его включить?
Ответ
Сжатие тела ответа (gzip, brotli) для уменьшения трафика. Включается через AddResponseCompression() и UseResponseCompression().
Вопрос
Как ускорить запуск приложения?
Ответ
Использованием AOT-компиляции (.NET 8+), уменьшением числа зависимостей, lazy-регистрацией сервисов и предварительной компиляцией представлений.
Вопрос
Что такое IAsyncEnumerable<T> и как его использовать в API?
Ответ
Позволяет потоково возвращать данные клиенту без загрузки всего результата в память. Возвращается из действия контроллера и сериализуется как NDJSON или SSE.
[HttpGet("stream")]
public async IAsyncEnumerable<Item> StreamItems()
{
await foreach (var item in _service.GetItemsAsync())
yield return item;
}
Вопрос
Как реализовать health check для внешнего сервиса?
Ответ
Созданием класса, реализующего IHealthCheck, и регистрации через AddCheck<T>(). В методе CheckHealthAsync выполняется проверка доступности (например, HTTP-запрос).
Миграция и совместимость
Вопрос
Как перейти с ASP.NET Framework на ASP.NET Core?
Ответ
Поэтапной миграцией: выделение общих библиотек, перенос контроллеров, замена Web.config на appsettings.json, переход на DI и middleware вместо HTTP-модулей.
Вопрос
Поддерживает ли ASP.NET Core веб-формы?
Ответ
Нет, веб-формы не поддерживаются в ASP.NET Core. Альтернатива — Razor Pages или Blazor Server.
Вопрос
Как использовать старые библиотеки .NET Framework в ASP.NET Core?
Ответ
Через многоцелевую компиляцию или перенос кода в .NET Standard. Прямое использование .NET Framework-сборок в .NET Core возможно только при совместимости.
Вопрос
Что такое OWIN и как он связан с ASP.NET Core?
Ответ
OWIN — спецификация взаимодействия между веб-серверами и приложениями. ASP.NET Core не использует OWIN, но может размещаться поверх него через адаптеры (например, Microsoft.AspNetCore.Owin).
Вопрос
Как обеспечить обратную совместимость API при изменении контракта?
Ответ
Версионированием API через URL (/api/v1/...), заголовки или параметры запроса, а также поддержкой нескольких DTO-версий в одном эндпоинте.
Событийная архитектура и интеграции
Вопрос
Как реализовать публикацию и обработку событий внутри приложения ASP.NET Core?
Ответ
С помощью шины событий (event bus), построенной на интерфейсах IEventPublisher и IEventHandler<T>, или через MediatR с использованием INotification и INotificationHandler<T>.
Вопрос
Что такое outbox-паттерн и зачем он нужен?
Ответ
Outbox-паттерн гарантирует согласованность между записью в базу данных и отправкой сообщений в шину. Сообщения сохраняются в таблицу «outbox» в той же транзакции, что и бизнес-данные, а затем фоновая служба отправляет их внешним получателям.
Вопрос
Как интегрироваться с RabbitMQ из ASP.NET Core?
Ответ
С использованием клиентской библиотеки RabbitMQ.Client или высокоуровневых обёрток, таких как MassTransit или CAP. Подключение настраивается через DI, а потребление сообщений — через фоновые службы.
Вопрос
Что такое CAP и как он используется?
Ответ
CAP — это библиотека для .NET, обеспечивающая надёжную доставку событий с поддержкой транзакций и outbox-паттерна. Она интегрируется с базами данных и брокерами сообщений (Kafka, RabbitMQ).
Вопрос
Как обрабатывать дедупликацию сообщений?
Ответ
Сохранением идентификаторов обработанных сообщений в хранилище (например, Redis или БД) и проверкой перед повторной обработкой. Идемпотентность логики также снижает риски.
Шаблоны проектирования в контексте ASP.NET Core
Вопрос
Как применяется паттерн Decorator в ASP.NET Core?
Ответ
Для добавления поведения к сервисам без изменения их кода. Реализуется через регистрацию обёртки в DI: services.Decorate<IService, LoggingServiceDecorator>() (требует сторонней поддержки или ручной регистрации).
Вопрос
Что такое паттерн Pipeline и где он используется?
Ответ
Pipeline — это цепочка обработчиков, каждый из которых выполняет часть логики. В ASP.NET Core он реализован в middleware, MediatR pipeline behaviors и обработчиках запросов.
Вопрос
Как использовать паттерн Strategy для выбора алгоритма?
Ответ
Регистрацией нескольких реализаций интерфейса и внедрением фабрики (IStrategyFactory) или словаря стратегий, выбираемых по ключу во время выполнения.
Впрос
Что такое паттерн Unit of Work и как он связан с Entity Framework Core?
Ответ
Unit of Work координирует изменения в нескольких репозиториях и фиксирует их одной транзакцией. В Entity Framework Core DbContext сам является реализацией этого паттерна.
Вопрос
Как реализовать паттерн Specification?
Ответ
Созданием классов, инкапсулирующих условия запроса (ISpecification<T>), и применением их к IQueryable<T> через методы расширения. Это позволяет повторно использовать и комбинировать условия фильтрации.
Облачное развёртывание и DevOps
Вопрос
Как подготовить ASP.NET Core-приложение к развёртыванию в Azure App Service?
Ответ
Публикацией как фреймворк-зависимого приложения (dotnet publish -c Release), настройкой строки подключения в Application Settings и включением Application Insights.
Вопрос
Что такое self-contained deployment?
Ответ
Это развёртывание, включающее среду выполнения .NET вместе с приложением. Оно не требует установки .NET на целевой машине и указывается флагом -r (runtime identifier).
Вопрос
Как настроить CI/CD для ASP.NET Core с помощью GitHub Actions?
Ответ
Созданием workflow-файла в .github/workflows, который восстанавливает зависимости, запускает тесты, публикует приложение и развертывает его на хостинге (например, через FTP, SSH или Azure Web Deploy).
Вопрос
Как использовать переменные окружения в продакшене?
Ответ
Переменные окружения переопределяют значения из appsettings.json. Они задаются на уровне хостинга (Docker, Azure, Linux) и автоматически загружаются провайдером конфигурации.
Вопрос
Как обеспечить безопасность секретов в CI/CD?
Ответ
Хранением секретов в зашифрованных переменных среды (secrets в GitHub Actions, Key Vault в Azure) и запретом их вывода в логи. Приложение получает их только во время выполнения.
Контейнеризация и оркестрация
Вопрос
Как создать Docker-образ для ASP.NET Core?
Ответ
С использованием многоступенчатого Dockerfile: первый этап — сборка с SDK, второй — копирование артефактов в образ на основе runtime:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY /app .
ENTRYPOINT ["dotnet", "MyApp.dll"]
Вопрос
Как настроить health check для Docker?
Ответ
Добавлением секции HEALTHCHECK в Dockerfile или настройкой liveness/readiness probes в Kubernetes манифесте, указывающих на эндпоинт /health.
Вопрос
Как передавать конфигурацию в контейнер?
Ответ
Через переменные окружения (-e), файлы конфигурации (-v для монтирования томов) или секреты Kubernetes/Docker Swarm.
Вопрос
Как масштабировать ASP.NET Core в Kubernetes?
Ответ
Созданием Deployment с несколькими репликами и Service типа ClusterIP или LoadBalancer. Горизонтальное автомасштабирование настраивается через HPA на основе метрик CPU или пользовательских показателей.
Вопрос
Что делать, если приложение не запускается в контейнере?
Ответ
Проверить права на файлы, порты (Kestrel по умолчанию слушает 8080), наличие зависимостей и корректность точки входа. Логи контейнера (docker logs) помогают диагностировать проблему.
Расширенные темы: Blazor и гибридные сценарии
Вопрос
Как интегрировать Blazor Server с существующим MVC-приложением?
Ответ
Добавлением AddServerSideBlazor() в DI и маршрутизацией _Host.cshtml через контроллер или Razor Page. Компоненты Blazor встраиваются в страницы через тег <component>.
Вопрос
Поддерживает ли Blazor WebAssembly аутентификацию?
Ответ
Да, через OIDC-библиотеку Microsoft.AspNetCore.Components.WebAssembly.Authentication, которая интегрируется с IdentityServer или другими провайдерами.
Вопрос
Как вызывать JavaScript из Blazor?
Ответ
С помощью IJSRuntime.InvokeAsync<T>("functionName", args).
Вопрос
Как передавать данные из MVC-контроллера в Blazor-компонент?
Ответ
Через параметры компонента при его рендеринге в Razor-странице или представлении:
<component type="typeof(MyComponent)" param-Data="@Model.Data" />
Вопрос
Можно ли использовать SignalR в Blazor WebAssembly?
Ответ
Да, клиент SignalR подключается к хабу так же, как в обычном JavaScript-клиенте, но с использованием C# API через HubConnectionBuilder.
Работа с файлами и потоками
Вопрос
Как безопасно загружать файлы в ASP.NET Core?
Ответ
Ограничением размера через RequestFormLimits, проверкой расширений и MIME-типов, сохранением под уникальным именем вне веб-корня и сканированием на вирусы при необходимости.
Вопрос
Как обрабатывать большие файлы без переполнения памяти?
Ответ
Использованием потоковой передачи: чтение IFormFile.OpenReadStream() и запись напрямую в файловое хранилище или базу данных фрагментами через буфер.
Вопрос
Как отдать файл клиенту как скачиваемый?
Ответ
С помощью метода PhysicalFile, FileStream или File с указанием ContentType и заголовка Content-Disposition:
return File(fileStream, "application/octet-stream", "filename.ext");
Вопрос
Как реализовать докачку файла (resumable upload)?
Ответ
Поддержкой заголовка Range на стороне клиента и сервера, сохранением частей в промежуточное хранилище и сборкой полного файла после получения всех фрагментов.
Вопрос
Где хранить загруженные файлы в облачном приложении?
Ответ
В объектных хранилищах, таких как Azure Blob Storage, AWS S3 или MinIO. Локальное хранилище не рекомендуется из-за эфемерности контейнеров и масштабируемости.
Локализация и интернационализация
Вопрос
Как включить локализацию в ASP.NET Core?
Ответ
Регистрацией сервисов AddLocalization, добавлением ресурсов (.resx) и middleware UseRequestLocalization, который определяет культуру из запроса.
Вопрос
Как определяется культура пользователя?
Ответ
Через провайдеры: заголовок Accept-Language, cookie, маршрут или пользовательский параметр. Порядок задаётся при настройке RequestLocalizationOptions.
Вопрос
Как локализовать строки в контроллерах?
Ответ
Внедрением IStringLocalizer<T> и вызовом индексатора:
var message = _localizer["Hello {0}", userName];
Вопрос
Как локализовать ошибки валидации модели?
Ответ
Созданием локализованных атрибутов или использованием глобальных ресурсов через DataAnnotationsLocalizationOptions.
Вопрос
Поддерживает ли Razor Pages локализацию?
Ответ
Да, через IViewLocalizer в страницах и общие ресурсы. Каждая страница может иметь свой файл .resx.
Отладка и диагностика в продакшене
Вопрос
Как получить стек вызовов при исключении в продакшене?
Ответ
Логированием исключения через ILogger.LogError(exception, message). Стек вызовов автоматически включается в запись.
Вопрос
Как отслеживать медленные запросы?
Ответ
С помощью middleware, измеряющего время выполнения, или встроенных метрик OpenTelemetry, отправляемых в систему наблюдаемости (например, Prometheus + Grafana).
Вопрос
Что делать при утечке памяти?
Ответ
Анализировать дампы памяти с помощью dotnet-dump или Visual Studio, искать захваченные scoped-сервисы в singleton, неосвобождённые подписки на события или кэши без ограничений.
Вопрос
Как включить трассировку запросов?
Ответ
Использованием ActivitySource и OpenTelemetry SDK для создания распределённых трасс, которые отображаются в Jaeger, Zipkin или Application Insights.
Вопрос
Как проверить, что DI-контейнер настроен корректно?
Ответ
Запуском валидации области при старте: scope.ServiceProvider.GetService<IServiceProviderIsService>(); или использованием ValidateScopes = true в среде разработки.
Типичные ошибки и их решение
Вопрос
Почему возникает ошибка «Cannot resolve scoped service from root provider»?
Ответ
Потому что scoped-сервис запрашивается из корневого контейнера, а не из области, созданной для HTTP-запроса. Решение — всегда использовать CreateScope() при ручном разрешении.
Вопрос
Почему контроллер не получает данные из JSON-тела?
Ответ
Потому что отсутствует атрибут [FromBody], клиент отправляет неверный Content-Type, или модель не соответствует структуре JSON.
Вопрос
Почему CORS не работает, хотя настроен?
Ответ
Потому что middleware UseCors() вызван до UseRouting() или после UseAuthorization(). Правильный порядок: UseRouting() → UseCors() → UseAuthentication() → UseAuthorization().
Вопрос
Почему миграции не применяются автоматически?
Ответ
Потому что метод context.Database.Migrate() не вызван при старте приложения или используется в неподходящем месте (например, в конструкторе сервиса).
Вопрос
Почему SignalR не подключается через Nginx?
Ответ
Потому что Nginx по умолчанию не проксирует WebSocket-соединения. Требуется явная настройка заголовков Upgrade и Connection.
Вопрос
Как обеспечить идемпотентность API-запросов?
Ответ
Требованием заголовка Idempotency-Key от клиента и сохранением результата первого запроса с этим ключом. Последующие запросы с тем же ключом возвращают кэшированный результат.
Вопрос
Как реализовать soft delete в Entity Framework Core?
Ответ
Добавлением свойства IsDeleted в сущность и переопределением SaveChanges, чтобы автоматически фильтровать удалённые записи через глобальные фильтры:
modelBuilder.Entity<Product>().HasQueryFilter(p => !p.IsDeleted);
Вопрос
Как поддерживать несколько баз данных (multi-tenancy)?
Ответ
Определением клиента по домену, заголовку или токену и динамической подстановкой строки подключения в DbContext через фабрику IDbContextFactory.
Вопрос
Как обновлять приложение без простоя?
Ответ
Использованием стратегии blue-green deployment или rolling update в Kubernetes, обеспечивая обратную совместимость API и миграций БД.
Вопрос
Как проверить готовность приложения к нагрузке?
Ответ
Проведением нагрузочного тестирования с помощью k6, JMeter или bombardier, анализом метрик памяти, CPU и времени ответа под нагрузкой.