نشر تطبيقات .NET على Azure: دليل شامل
تعلّم كيفية نشر تطبيقات .NET بكفاءة على منصة Azure السحابية من خلال هذا الدليل التفصيلي خطوة بخطوة، الذي يغطي App Service وFunctions وContainers وDevOps.
InSkillCoach
نشر تطبيقات .NET على Azure: دليل شامل
مقدمة
تقدّم Microsoft Azure منظومة غنية وعالية الأداء لاستضافة تطبيقات .NET. وبفضل التكامل الأصلي بين .NET وAzure، يمكنك نشر تطبيقاتك بسهولة والاستفادة من التوسّع التلقائي والتوافر العالي وأمان معزَّز. يعرض لك هذا الدليل خيارات النشر المختلفة وأفضل الممارسات لتحسين تطبيقات .NET في السحابة.
المتطلبات الأساسية
قبل البدء، تأكد من توفر ما يلي:
- حساب Azure (يمكنك إنشاء حساب مجاني على azure.microsoft.com)
- تثبيت .NET SDK على جهاز التطوير الخاص بك
- تثبيت Azure CLI أو Azure PowerShell (اختياري لكنه موصى به)
- Visual Studio 2022 أو Visual Studio Code مع إضافة Azure
- Git لإدارة الإصدارات
Azure App Service لتطبيقات الويب بتقنية .NET
تُعد Azure App Service الحل الأمثل من نوع PaaS (Platform as a Service) لاستضافة تطبيقات ASP.NET وASP.NET Core.
إنشاء App Service من بوابة Azure
- سجّل الدخول إلى بوابة Azure
- انقر على “إنشاء مورد” > “الويب” > “App Service”
- أكمل المعلومات الأساسية:
- مجموعة الموارد: أنشئ مجموعة جديدة أو استخدم مجموعة موجودة
- اسم التطبيق: يجب أن يكون فريدًا على مستوى Azure
- النشر: اختر “Code”
- حزمة التشغيل: اختر ”.NET 6” (أو الإصدار الذي تستخدمه)
- نظام التشغيل: Windows أو Linux
- المنطقة: اختر الأقرب إلى مستخدميك
- خطة App Service: اختر خطة موجودة أو أنشئ خطة جديدة
- انقر على “مراجعة + إنشاء” ثم “إنشاء”
النشر من Visual Studio
- افتح الحل (solution) الخاص بك في Visual Studio
- انقر بزر الفأرة الأيمن على مشروع الويب واختر “Publish”
- اختر “Azure” كوجهة
- اختر “Azure App Service” ثم النسخة التي أنشأتها للتو
- اضبط إعدادات النشر وانقر على “Publish”
النشر عبر Azure DevOps
# azure-pipelines.yml
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
buildConfiguration: 'Release'
webAppName: 'votre-app-service'
steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '6.x'
- script: dotnet build --configuration $(buildConfiguration)
displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: true
- task: AzureWebApp@1
inputs:
azureSubscription: 'votre-connexion-azure'
appName: '$(webAppName)'
package: '$(Build.ArtifactStagingDirectory)/*.zip'
إعداد البيئة
استخدم إعدادات التطبيق (Application Settings) لضبط تطبيقك دون إعادة تجميعه:
- في بوابة Azure، انتقل إلى App Service الخاصة بك
- ضمن “Configuration” > “Application settings”، أضف متغيرات البيئة الخاصة بك
- على سبيل المثال، لسلسلة الاتصال بقاعدة بيانات:
- الاسم: ConnectionStrings__DefaultConnection
- القيمة: سلسلة الاتصال الخاصة بك
Azure Functions للخدمات المصغّرة بدون خوادم (serverless)
تتيح Azure Functions تنفيذ أجزاء من الشيفرة دون إدارة البنية التحتية الأساسية.
إنشاء Function App
// Function App بسيطة تستجيب لطلبات HTTP
public static class HttpExample
{
[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
string responseMessage = string.IsNullOrEmpty(name)
? "Cette fonction HTTP a été exécutée avec succès. Passez un nom dans la requête pour obtenir un message personnalisé."
: $"Bonjour, {name}. Cette fonction HTTP a été exécutée avec succès.";
return new OkObjectResult(responseMessage);
}
}
نشر Azure Functions
من Visual Studio
- أنشئ مشروع Azure Functions
- طوّر دوالك
- انقر بزر الفأرة الأيمن على المشروع > “Publish”
- اختر Azure كوجهة
- اختر Function App أو أنشئ واحدة جديدة
باستخدام Azure CLI
# الاتصال بـ Azure
az login
# إنشاء مجموعة موارد (عند الحاجة)
az group create --name MonGroupeDeRessources --location francecentral
# إنشاء Function App
az functionapp create --resource-group MonGroupeDeRessources --consumption-plan-location francecentral --runtime dotnet --functions-version 4 --name MonAppDeFonctions --storage-account monstockage
# نشر الشيفرة
func azure functionapp publish MonAppDeFonctions
الحاويات باستخدام Docker وAzure Container Registry
توفّر حاويات تطبيقات .NET قابلية النقل والاتساق بين البيئات المختلفة.
إنشاء Dockerfile لتطبيق ASP.NET Core
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MonApp.csproj", "./"]
RUN dotnet restore "MonApp.csproj"
COPY . .
RUN dotnet build "MonApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MonApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MonApp.dll"]
إنشاء Azure Container Registry (ACR) واستخدامه
# إنشاء سجل للحاويات
az acr create --resource-group MonGroupeDeRessources --name monregistre --sku Basic
# الاتصال بالسجل
az acr login --name monregistre
# بناء صورة Docker
docker build -t monapp:v1 .
# وسم الصورة لـ ACR
docker tag monapp:v1 monregistre.azurecr.io/monapp:v1
# دفع الصورة إلى ACR
docker push monregistre.azurecr.io/monapp:v1
النشر على Azure App Service باستخدام الحاويات
# تفعيل وصول المسؤول إلى السجل
az acr update -n monregistre --admin-enabled true
# الحصول على بيانات اعتماد السجل
az acr credential show -n monregistre
# إنشاء App Service Plan يدعم الحاويات
az appservice plan create --resource-group MonGroupeDeRessources --name MonPlanAppService --is-linux --sku B1
# إنشاء App Service تستخدم الحاوية
az webapp create --resource-group MonGroupeDeRessources --plan MonPlanAppService --name MonAppWeb --deployment-container-image-name monregistre.azurecr.io/monapp:v1
# ضبط بيانات اعتماد السجل
az webapp config container set --name MonAppWeb --resource-group MonGroupeDeRessources --docker-custom-image-name monregistre.azurecr.io/monapp:v1 --docker-registry-server-url https://monregistre.azurecr.io --docker-registry-server-user monregistre --docker-registry-server-password <mot-de-passe>
Azure Kubernetes Service (AKS) لتطبيقات .NET
تُعد AKS مثالية للتطبيقات المعقدة التي تتطلب تنسيقًا متقدمًا للحاويات.
نشر تطبيق .NET على AKS
- أنشئ عنقود AKS:
az aks create --resource-group MonGroupeDeRessources --name MonClusterAKS --node-count 2 --enable-addons monitoring --generate-ssh-keys
- اتصل بالعنقود:
az aks get-credentials --resource-group MonGroupeDeRessources --name MonClusterAKS
- أنشئ ملف نشر Kubernetes (deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: monapp
spec:
replicas: 3
selector:
matchLabels:
app: monapp
template:
metadata:
labels:
app: monapp
spec:
containers:
- name: monapp
image: monregistre.azurecr.io/monapp:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: monapp
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: monapp
- انشر التطبيق على AKS:
kubectl apply -f deployment.yaml
- تحقق من إمكانية الوصول إلى الخدمة:
kubectl get services monapp
قواعد بيانات Azure لتطبيقات .NET
Azure SQL Database مع Entity Framework Core
-
أنشئ قاعدة بيانات Azure SQL من بوابة Azure
-
اضبط سلسلة الاتصال في تطبيقك:
// appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=tcp:monserveur.database.windows.net,1433;Database=maBaseDeDonnees;User ID=monutilisateur;Password=monMotDePasse;Encrypt=true;Connection Timeout=30;"
}
}
- استخدم Entity Framework Core للاتصال:
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
// ...
}
Azure Cosmos DB لقواعد بيانات NoSQL
// إعداد عميل Cosmos DB
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<CosmosClient>(serviceProvider => {
var configuration = serviceProvider.GetRequiredService<IConfiguration>();
var cosmosDbSection = configuration.GetSection("CosmosDb");
var endpoint = cosmosDbSection["Endpoint"];
var key = cosmosDbSection["Key"];
return new CosmosClient(endpoint, key);
});
services.AddSingleton<IDocumentRepository, CosmosDbRepository>();
}
CI/CD لتطبيقات .NET باستخدام GitHub Actions
سير عمل GitHub Actions لـ App Service
# .github/workflows/azure-webapps-dotnet.yml
name: .NET Core CI/CD pour Azure Web App
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
AZURE_WEBAPP_NAME: votre-app-service
AZURE_WEBAPP_PACKAGE_PATH: '.'
DOTNET_VERSION: '6.0.x'
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configurer .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Restaurer les dépendances
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Test
run: dotnet test --no-restore --verbosity normal
- name: Publish
run: dotnet publish -c Release -o ${{env.AZURE_WEBAPP_PACKAGE_PATH}}/myapp
- name: Déployer sur Azure Web App
uses: azure/webapps-deploy@v2
with:
app-name: ${{ env.AZURE_WEBAPP_NAME }}
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
package: ${{env.AZURE_WEBAPP_PACKAGE_PATH}}/myapp
المراقبة والتشخيص
Application Insights للمراقبة
-
أنشئ مورد Application Insights في بوابة Azure
-
ادمج Application Insights في تطبيقك:
// Program.cs (.NET 6)
var builder = WebApplication.CreateBuilder(args);
// إضافة Application Insights
builder.Services.AddApplicationInsightsTelemetry();
// ...
var app = builder.Build();
- أضف سجلات مخصصة:
// في وحدة تحكم (controller) أو خدمة
public class MonController : Controller
{
private readonly ILogger<MonController> _logger;
public MonController(ILogger<MonController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation("La page d'accueil a été visitée");
return View();
}
}
- اعرض المقاييس في بوابة Azure Application Insights
تأمين تطبيقات .NET على Azure
استخدام Azure Key Vault
-
أنشئ مخزن مفاتيح (Key Vault) في بوابة Azure
-
امنح الأذونات لتطبيقك:
az keyvault set-policy --name MonCoffre --object-id <object-id-de-votre-app> --secret-permissions get list
- ادمج Key Vault في تطبيقك:
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// إضافة إعدادات Azure Key Vault
builder.Configuration.AddAzureKeyVault(
new Uri($"https://{builder.Configuration["KeyVault:VaultName"]}.vault.azure.net/"),
new DefaultAzureCredential());
إعداد Azure AD B2C للمصادقة
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"));
// ...
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
تحسين التكاليف
نصائح لخفض التكاليف على Azure
-
اختيار المستوى التسعيري المناسب:
- استخدم المستويين Free وShared في مرحلة التطوير
- فكّر في Basic/Standard للإنتاج على نطاق صغير إلى متوسط
-
التوسّع التلقائي:
- اضبط التوسّع التلقائي (autoscaling) وفق احتياجاتك
az monitor autoscale create --resource-group MonGroupeDeRessources --resource monappservice --resource-type "Microsoft.Web/sites" --name autoscale-config --min-count 1 --max-count 5 --count 1 -
استخدام النسخ المحجوزة (Reserved Instances) لتحقيق وفورات على المدى الطويل
-
تفعيل Azure Cost Management لمراقبة النفقات وتحسينها
-
تنظيف الموارد غير المستخدمة بانتظام
أفضل الممارسات لـ .NET على Azure
-
بنية Cloud-Native:
- صمّم من أجل المرونة وقابلية التوسّع
- استخدم البنى بدون خوادم (serverless) عند الاقتضاء
-
إدارة الإعدادات خارج الشيفرة:
- خزّن الإعدادات في Azure App Configuration أو Key Vault
- استخدم متغيرات البيئة للإعدادات الخاصة
-
مراقبة شاملة:
- ادمج Application Insights منذ البداية
- اضبط تنبيهات للمقاييس الحرجة
-
الاختبارات الآلية:
- أدرج اختبارات الحِمل الخاصة بـ Azure تحديدًا
- استخدم بيئات الاختبار/ما قبل الإنتاج
-
البنية التحتية ككود (IaC):
- استخدم Azure Resource Manager (ARM) أو Terraform
// مثال على قالب ARM { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "appServiceName": { "type": "string", "metadata": { "description": "Nom de l'App Service" } } }, "resources": [ { "type": "Microsoft.Web/serverfarms", "apiVersion": "2020-06-01", "name": "[parameters('appServiceName')]", "location": "[resourceGroup().location]", "sku": { "name": "B1", "tier": "Basic" } } ] }
الخاتمة
توفّر Azure منظومة غنية ومتكاملة لتطبيقات .NET الخاصة بك، تتيح تغطية دورة حياة التطوير بأكملها. وبالجمع بين خدمات Azure وأفضل ممارسات تطوير .NET، يمكنك إنشاء تطبيقات قوية وعالية الأداء وقابلة للتوسع.
إن الأدوات والخدمات المعروضة في هذا الدليل ليست سوى البداية مما يمكن أن تقدمه Azure لمطوّري .NET. لا تترددوا في استكشاف المزيد والجمع بين خدمات مختلفة لتلبية الاحتياجات الخاصة بتطبيقكم.
مصادر إضافية
نبذة عن InSkillCoach
خبير في التدريب والتقنيات
مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.
الشهادات:
- AWS Certified Solutions Architect – Professional
- شهادات Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش