Ми розробляємо backend на .NET для мобільних додатків. ASP.NET Core — очевидний вибір, коли продукт живе в Microsoft-екосистемі: Azure, Active Directory, Power BI, MS SQL Server. Для Xamarin/MAUI-команд це ще й спільна мова з мобільним клієнтом — бізнес-логіка в shared-бібліотеках, C# скрізь. Наш досвід: понад 5 років розробки .NET рішень, понад 50 успішних проєктів для мобільних додатків.
Backend на .NET для мобільного додатку: ключові рішення
Як уникнути блокуючого I/O в async-коді?
Блокуючий I/O — одна з частих причин таймаутів у мобільних додатках. .Result або .Wait() на Task всередині async-методу призводить до deadlock в ASP.NET Core Synchronization Context. Мобільний клієнт отримує таймаут, сервер — завислий запит. Діагностується через dotnet-trace та async void звіт. Фікс: await скрізь, без винятків, і ConfigureAwait(false) в бібліотечному коді.
EF Core lazy loading: чому це небезпечно для мобільного API?
За замовчуванням в EF Core lazy loading вимкнено, але варто підключити UseLazyLoadingProxies() — і кожен foreach по навігаційній властивості стає окремим SQL. Для мобільного API використовуємо явне завантаження: Include() / ThenInclude() або проекцію через Select() прямо в DTO — це і швидше, і не тягне зайві поля. Порівняння підходів:
| Підхід | Опис | Продуктивність |
|---|---|---|
| Lazy Loading (EF Proxies) | Автоматично завантажує пов'язані дані за запитом | Низька: кожен доступ — новий SQL запит (N+1) |
| Eager Loading (Include/ThenInclude) | Явно вказуємо, які дані завантажувати | Висока: один SQL з JOIN, але тягнемо всі поля |
| Explicit Loading | Завантажуємо пов'язані дані вручну після основного запиту | Середня: гнучкий контроль, але більше коду |
| Projection (Select to DTO) | Проєктуємо лише потрібні поля без відстеження | Оптимальна: мінімум даних, немає відстеження |
Стек та підходи
Базовий стек: ASP.NET Core, EF Core + 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, MS SQL Server, Azure Service Bus для подієвої шини. Проблема: endpoint /api/reports/summary виконувався 4–8 секунд, перевищуючи таймаут мобільного клієнта. Причина — EF Core будував запит з 6 JOIN'ами через навігаційні властивості, MS SQL не використовував індекси через CAST в WHERE-умові. Рішення: перехід на Dapper для аналітичних запитів, додавання обчислюваного індексу. Результат: 180ms — зниження часу більш ніж у 20 разів.
Чому варто використовувати 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.
Як налаштувати реалтайм функціонал в мобільному додатку?
- Встановіть NuGet пакет
Microsoft.AspNetCore.SignalRна сервер та налаштуйте Hub вStartup.cs. - Підключіть клієнта: на iOS використовуйте
SwiftSignalRClient, на Android —signalr-clientдля Kotlin. - Для масштабування використовуйте Azure SignalR Service — він керує WebSocket-з'єднаннями та автоматично падає на Long Polling при проблемах з мережею.
- Безпека: передавайте JWT-токен в query string при встановленні з'єднання та перевіряйте його в Hub через
Context.User.
Деплой
Docker + Azure Container Apps або AKS. dotnet publish --configuration Release -r linux-x64 з --self-contained дає бінарник без залежності від .NET Runtime в образі (але збільшує розмір). Для Kubernetes — health checks через IHealthCheck інтерфейс, liveness та readiness endpoints.
Що входить в роботу
- Проєкт API: OpenAPI/Swagger специфікація, повна документація по ендпоінтах.
- Міграції бази даних (Entity Framework Migrations або скрипти).
- Конфігурація CI/CD (Azure DevOps, GitHub Actions).
- Інструкції по деплою (Docker, Kubernetes).
- Код-рев'ю та навантажувальне тестування.
- Підтримка 2 місяці після здачі (виправлення багів, консультації).
Терміни: API з 15–20 методами, Identity, пушами, Azure інтеграцією — 4–6 тижнів. Корпоративна система з AD, Service Bus, складною рольовою моделлю — 10–16 тижнів. Замовте розробку backend під ключ — ми оцінимо ваш проєкт за один день та запропонуємо оптимальну архітектуру.
Microsoft Docs: ASP.NET Core SignalR overview Wikipedia: CQRS







