Розробка .NET бекенду для мобільних додатків
ASP.NET Core — очевидний вибір, коли продукт живе в Microsoft-екосистемі: Azure, Active Directory, Power BI, MS SQL Server. Для Xamarin/MAUI-команд це ще й спільна мова з мобільним клієнтом — бізнес-логіка у shared-бібліотеках, C# повсюди.
Типові проблеми .NET-бекенду для мобайла
Блокуючий I/O у async-коді. .Result або .Wait() на Task всередину async-методу — deadlock у ASP.NET Core Synchronization Context. Мобільний клієнт отримує таймаут, сервер — зависший запит. Діагностується через dotnet-trace та async void звіт. Фікс: await повсюди, без винятків, та ConfigureAwait(false) у бібліотечному коді.
EF Core lazy loading у API. За умовчанням у EF Core 8 lazy loading відключений, але стоїть підключити UseLazyLoadingProxies() — і кожен foreach по навігаційній властивості стає окремим SQL. Для мобільного API використовуємо явну загрузку: Include() / ThenInclude() або проекцію через Select() прямо в DTO — це і швидше, і не тягне лишніх полів.
Стек та підходи
Базовий стек: ASP.NET Core 8, EF Core 8 + PostgreSQL (Npgsql) або MS SQL Server, MediatR для CQRS-паттерну, FluentValidation, Serilog для структурованих логів у Elasticsearch/Seq.
Автентифікація — ASP.NET Core Identity + JWT Bearer через Microsoft.AspNetCore.Authentication.JwtBearer. Для корпоративних додатків — інтеграція з Azure AD / Microsoft Entra ID через Microsoft.Identity.Web: пара рядків конфігурації та MSAL на мобільному клієнті роблять SSO з коробки.
Push-сповіщення: Azure Notification Hubs якщо інфраструктура в Azure — це managed-сервіс поверх FCM та APNs, масштабується до мільйонів пристроїв. Альтернатива — пряма інтеграція через офіційний FirebaseAdmin NuGet та dotnet-apns (HTTP/2).
Кейс: корпоративна мобільна додаток для 3000 співробітників, iOS + Android. Бекенд — ASP.NET Core 6, MS SQL Server, Azure Service Bus для event bus. Проблема: endpoint /api/reports/summary виконувався 4–8 секунд, перевищуючи таймаут мобільного клієнта. Причина — EF Core будував запит з 6 JOIN'ами через навігаційні властивості, MS SQL не використовував індекси через CAST у WHERE-умові. Рішення: перехід на Dapper для аналітичних запитів, додавання обчислювального індексу. Результат: 180ms.
CQRS з MediatR
Для мобільного API CQRS виправданий навіть на невеликих проектах: read-моделі оптимізовані під екрани клієнта (без лишніх полів), write-моделі — під бізнес-логіку. MediatR pipeline behavior — зручна місце для валідації (FluentValidation), логування, retry-політик (Polly).
// Query handler з проекцією — тільки потрібні поля
public async Task<ProductListDto> Handle(GetProductsQuery request, ...)
{
return await _context.Products
.Where(p => p.IsActive)
.Select(p => new ProductListDto(p.Id, p.Name, p.Price, p.ThumbnailUrl))
.ToListAsync(cancellationToken);
}
SignalR для реалтайму
Якщо мобільний клієнт потрібен реалтайм (чат, live-трекінг, сповіщення в реальному часі) — SignalR з Azure SignalR Service для горизонтального масштабування. На iOS SignalR клієнт (SignalRClient через microsoft-signalr npm або SwiftSignalRClient) підтримує WebSocket з автоматичним fallback на Long Polling.
Деплой
Docker + Azure Container Apps або AKS. dotnet publish --configuration Release -r linux-x64 з --self-contained дає бінарник без залежності від .NET Runtime у образі (але збільшує розмір). Для Kubernetes — health checks через IHealthCheck інтерфейс, liveness та readiness endpoints.
Терміни: API з 15–20 методами, Identity, push-и, Azure інтеграція — 4–6 тижнів. Корпоративна система з AD, Service Bus, складною ролевою моделлю — 10–16 тижнів.







