Отметим: когда ваш 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 месяца.







