Зауважте: коли ваш 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 місяці.







