Отметим: когда ваш REST API на Node.js или Python начинает тормозить уже на тысяче запросов в секунду, а синхронные обращения к PostgreSQL превращают latency в русскую рулетку — пора взглянуть на платформу с предсказуемой производительностью. ASP.NET Core на Kestrel легко выдаёт 50–80 тыс. RPS на одном ядре, и это не маркетинг, а реальные цифры Microsoft Docs: ASP.NET Core performance benchmarks. Мы переписывали десятки бэкендов с Node.js и Python на C# — производительность росла в 3–5 раз при сохранении архитектуры.
C# выбирают не только за скорость. Строгая типизация, встроенный DI, OpenAPI из коробки и богатая экосистема NuGet снижают стоимость владения. Если в проекте уже есть WPF-клиент или Blazor-интерфейс, монорепо на одном языке устраняет дублирование бизнес-логики. Мы работаем с .NET более 10 лет и реализовали свыше 50 проектов: от highload API до корпоративных порталов с Active Directory.
Результат разработки включает:
- REST/GraphQL API с автоматической OpenAPI-спецификацией
- Аутентификацию через JWT, Azure AD или IdentityServer
- Фоновые задачи (Hangfire, IHostedService)
- Real-time уведомления (SignalR)
- CI/CD с Docker и оркестрацией
- Полную документацию и обучение команды
Когда .NET незаменим
Enterprise-проекты с тысячами RPS, интеграция с Active Directory/Azure AD, требования к транзакционной консистентности — это зона ответственности .NET. Если ваша команда уже знает C#, выбор очевиден. Даже для небольших проектов ASP.NET Core Minimal API позволяет стартовать без лишнего кода.
Как мы проектируем бэкенд на C#?
Ниже — реальные фрагменты кода, которые прошли code review и работают в production.
Minimal API и JWT-аутентификация
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<AppDbContext>(opt => opt.UseNpgsql(builder.Configuration.GetConnectionString("Default")));
builder.Services.AddScoped<IUserService, UserService>();
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Secret"]!))
};
});
var app = builder.Build();
app.MapGet("/users/{id:int}", async (int id, IUserService svc) =>
await svc.GetByIdAsync(id) is { } user ? Results.Ok(user) : Results.NotFound());
app.MapPost("/users", async (CreateUserDto dto, IUserService svc) =>
{
var user = await svc.CreateAsync(dto);
return Results.Created($"/users/{user.Id}", user);
});
app.Run();Этот код — стандартный скелет production-сервиса. Для сложных проектов мы используем Vertical Slice Architecture с MediatR, что позволяет держать каждый сценарий изолированным.
EF Core или Dapper? Сравнение в таблице
| Критерий | Entity Framework Core | Dapper |
|---|---|---|
| Тип ORM | Full ORM с Unit of Work | Micro-ORM (обёртка ADO.NET) |
| Производительность | Медленнее на массовых операциях | Быстрее в 2–5 раз |
| Миграции | Встроенные (Add-Migration) | Нет, нужны внешние инструменты |
| Удобство CRUD | Минимальный код, Lazy Loading | Ручной SQL |
| Когда выбирать | CRUD-тяжёлые сервисы, прототипы | Отчётность, batch-операции |
В наших проектах мы часто комбинируем оба подхода: EF Core для стандартных запросов, Dapper — для тяжёлой отчётности. Это даёт до 40% снижения затрат на инфраструктуру.
Output Cache и фоновые задачи
builder.Services.AddOutputCache(opt =>
{
opt.AddPolicy("products", p => p.Expire(TimeSpan.FromMinutes(10)).Tag("products"));
});
app.MapGet("/products", async (IProductRepo repo) => await repo.GetAllAsync())
.CacheOutput("products");
app.MapPost("/products", async (CreateProductDto dto, IOutputCacheStore cache, ...) =>
{
var product = await svc.CreateAsync(dto);
await cache.EvictByTagAsync("products", CancellationToken.None);
return Results.Created($"/products/{product.Id}", product);
});Output Cache — встроенное решение начиная с .NET 8. Для фоновых задач используем IHostedService или Hangfire, в зависимости от сложности очереди.
Деплой и Health Checks
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyApi.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
ENV ASPNETCORE_URLS=http://+:8080
ENV ASPNETCORE_ENVIRONMENT=Production
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApi.dll"]
Health checks для оркестраторов:
builder.Services.AddHealthChecks()
.AddNpgsql(connStr, name: "postgres")
.AddRedis(redisConn, name: "redis");
app.MapHealthChecks("/health/live", new HealthCheckOptions { Predicate = _ => false });
app.MapHealthChecks("/health/ready"); Настройка JWT в ASP.NET Core
- Установите пакет
Microsoft.AspNetCore.Authentication.JwtBearer. - В
Program.csдобавьтеAddAuthenticationс параметрами: ValidIssuer, ValidAudience, IssuerSigningKey. - Настройте авторизацию через
AddAuthorizationс политиками. - Примените middleware
app.UseAuthentication();иapp.UseAuthorization();.
Пример конфигурации приведён выше. В production мы добавляем Refresh Tokens и используем IdentityServer для централизованного управления.
Дополнительно: настройка SignalR
Для real-time уведомлений используется SignalR. Подключение через AddSignalR(), хаб наследуется от Hub. Аутентификация — через JWT в query string. Масштабирование через Redis backplane для серверной фермы.
Типичные ошибки при разработке на ASP.NET Core
- N+1 запрос в EF Core — используйте
.Include()или проекции через.Select(). - Отсутствие async/await в I/O операциях — блокировка потоков резко снижает пропускную способность.
- Синхронная работа с хэшами паролей — bcrypt или PBKDF2 обязательны.
- Игнорирование middleware pipeline — порядок регистрации middleware критичен.
Что входит в разработку?
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика | 1–2 дня | Техническое задание, архитектура |
| Проектирование | 2–3 дня | UML-схемы, choice of stack |
| Реализация | от 5 дней | Код, покрытый unit-тестами |
| Тестирование | 2–3 дня | Интеграционные тесты, нагрузочное тестирование |
| Деплой | 1–2 дня | CI/CD pipeline, мониторинг |
| Поддержка | по договорённости | 24/7 мониторинг, обновления |
Мы предоставляем полную документацию по API (Swagger), доступ к исходному коду и обучение вашей команды.
Оценка сроков разработки
Простой REST API (10–15 эндпоинтов, одна БД, JWT): 5–8 рабочих дней. Полноценный сервис с ролями, фоновыми задачами, SignalR и CI/CD: 3–5 недель. Миграция с .NET Framework на .NET Core оценивается отдельно после аудита кода — обычно занимает 2–6 недель.
Обсудите ваш проект с нашим архитектором: напишите нам с кратким описанием задачи — мы оценим сроки и стоимость за 1–2 рабочих дня. Свяжитесь с нами для консультации и закажите оценку вашего проекта уже сегодня. Мы гарантируем качество кода и предоставляем официальную гарантию на 3 месяца.







