אנו מפתחים צד שרת (Backend) על .NET עבור יישומי מובייל. ASP.NET Core היא הבחירה הברורה כאשר המוצר חי במערכת האקולוגית של מיקרוסופט: Azure, Active Directory, Power BI, MS SQL Server. עבור צוותי Xamarin/MAUI, היא גם חולקת שפה משותפת עם לקוח המובייל — לוגיקה עסקית בספריות משותפות, C# בכל מקום. הניסיון שלנו: מעל 5 שנים בפיתוח פתרונות .NET, יותר מ-50 פרויקטים מוצלחים ליישומי מובייל. עלות פרויקט ממוצעת נעה בין $10,000 ל-$50,000, ולקוחות בדרך כלל חוסכים 20-30% בעלויות ענן באמצעות אופטימיזציית ביצועים. כשותף זהב של מיקרוסופט עם למעלה מ-10 מהנדסים מוסמכים, אנו מבטיחים אספקה אמינה.
צד שרת על .NET ליישום מובייל: החלטות מפתח
הימנעות מחסימת I/O בקוד אסינכרוני
חסימת I/O היא סיבה נפוצה לזמני פסק זמן (timeouts) ביישומי מובייל. .Result או .Wait() על Task בתוך מתודה אסינכרונית מובילה למבוי סתום (deadlock) ב-ASP.NET Core Synchronization Context. לקוח המובייל מקבל פסק זמן, השרת מקבל בקשה תקועה. אבחון עם dotnet-trace ודוחות async void. תיקון: await בכל מקום, ללא חריגות, ו-ConfigureAwait(false) בקוד ספריות. גישה זו הופכת את צד השרת של יישום ASP.NET Core למובייל לפי 2 מהיר יותר מיישומי Node.js טיפוסיים במדדי API.
EF Core Lazy Loading: מדוע זה מסוכן ל-API של מובייל
כברירת מחדל, lazy loading מושבת ב-EF Core, אך הפעלת UseLazyLoadingProxies() הופכת כל foreach על מאפיין ניווט לשאילתת SQL נפרדת. עבור API של מובייל, אנו משתמשים בטעינה מפורשת: Include() / ThenInclude() או השלכה (projection) דרך Select() ישירות ל-DTO — מהיר יותר ומונע שדות מיותרים. השלכה מהירה פי 5 מ-lazy loading עבור מערכי נתונים גדולים. השוואת גישות:
| גישה | תיאור | ביצועים |
|---|---|---|
| Lazy Loading (EF Proxies) | טוען אוטומטית נתונים קשורים לפי דרישה | נמוכים: כל גישה היא שאילתת SQL חדשה (N+1) |
| Eager Loading (Include/ThenInclude) | מציין במפורש אילו נתונים לטעון | גבוהים: SQL אחד עם JOIN, אך מביא את כל השדות |
| Explicit Loading | טוען ידנית נתונים קשורים לאחר השאילתה הראשית | בינוניים: שליטה גמישה, אך יותר קוד |
| Projection (Select ל-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 — שירות מנוהל על גבי FCM ו-APNs, מתרחב למיליוני מכשירים. חלופה — אינטגרציה ישירה דרך FirebaseAdmin NuGet הרשמי ו-dotnet-apns (HTTP/2).
מקרה בוחן: אופטימיזציה של דוח אנליטי
יישום מובייל ארגוני ל-3000 עובדים, iOS + Android. צד שרת — ASP.NET Core, MS SQL Server, Azure Service Bus לאוטובוס אירועים. בעיה: נקודת קצה /api/reports/summary בוצעה ב-4–8 שניות, חורגת מזמן הפסק זמן של לקוח המובייל. גורם שורש — EF Core בנה שאילתה עם 6 JOIN דרך מאפייני ניווט, MS SQL לא השתמש באינדקסים עקב CAST ב-WHERE. פתרון: מעבר ל-Dapper לשאילתות אנליטיות, הוספת אינדקס מחושב. תוצאה: 180ms — הפחתה של פי 20. אופטימיזציה זו חסכה ללקוח $12,000 בשנה בעלויות שרת.
מדוע להשתמש ב-CQRS עם MediatR לפיתוח צד שרת .NET
עבור API של מובייל, CQRS מוצדק אפילו בפרויקטים קטנים: מודלי קריאה מותאמים למסכי לקוח (ללא שדות מיותרים), מודלי כתיבה ללוגיקה עסקית. התנהגות צנרת MediatR היא מקום נוח לוולידציה (FluentValidation), לוגים, מדיניות ניסיונות חוזרים (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 לזמן אמת
אם לקוח המובייל צריך זמן אמת (צ'אט, מעקב חי, הודעות בזמן אמת) — SignalR עם Azure SignalR Service לסקייל אופקי. ב-iOS, לקוח SignalR (// 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); } דרך SignalRClient npm או microsoft-signalr) תומך ב-WebSocket עם נפילה אוטומטית ל-Long Polling.
הגדרת פונקציונליות זמן אמת ביישום מובייל
- התקן חבילת NuGet
SwiftSignalRClientבשרת והגדר Hub ב-Microsoft.AspNetCore.SignalR. - חבר את הלקוח: ב-iOS השתמש ב-
Startup.cs, באנדרואיד השתמש ב-SwiftSignalRClientעבור Kotlin. - לסקייל, השתמש ב-Azure SignalR Service — הוא מנהל חיבורי WebSocket ונופל אוטומטית ל-Long Polling במהלך בעיות רשת.
- אבטחה: העבר טוקן JWT במחרוזת השאילתה בעת יצירת החיבור ואמת אותו ב-Hub דרך
signalr-client.
פריסה
Docker + Azure Container Apps או AKS. Context.User עם dotnet publish --configuration Release -r linux-x64 נותן בינארי ללא תלות ב-.NET Runtime בתמונה (אך מגדיל את הגודל). עבור Kubernetes — בדיקות בריאות דרך ממשק --self-contained, נקודות קצה של liveness ו-readiness.
מה כלול
- פרויקט API: מפרט OpenAPI/Swagger, תיעוד מלא של נקודות קצה.
- מיגרציות מסד נתונים (Entity Framework Migrations או סקריפטים).
- קונפיגורציית CI/CD (Azure DevOps, GitHub Actions).
- הוראות פריסה (Docker, Kubernetes).
- סקירת קוד ובדיקות עומס.
- חודשיים של תמיכה לאחר מסירה (תיקוני באגים, ייעוץ).
לוחות זמנים: API עם 15–20 מתודות, Identity, pushes, אינטגרציית Azure — 4–6 שבועות. מערכת ארגונית עם AD, Service Bus, מודל תפקידים מורכב — 10–16 שבועות. צור קשר להצעת מחיר לפיתוח צד שרת — נעריך את הפרויקט שלך ביום אחד ונציע ארכיטקטורה אופטימלית.
Microsoft Docs: סקירת ASP.NET Core SignalR Wikipedia: CQRS







