ترتيب Middleware وMiddleware المضمّن
افهموا الترتيب الصحيح لـ middleware الخاص بالمصادقة والتوجيه وCORS ومعالجة الاستثناءات.
ترتيب Middleware وMiddleware المضمّن درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
لماذا يهم الترتيب؟
تُشغَّل البرمجيات الوسيطة في ASP.NET Core بالترتيب الدقيق الذي سُجّلت به. وقد يؤدي الترتيب الخاطئ إلى ثغرات أمنية أو مشكلات في الأداء أو سلوك معطّل؛ فعلى سبيل المثال، يجب أن يسبق التوجيهُ التخويلَ، الذي يجب أن يسبق تنفيذ نقطة النهاية.
الترتيب الموصى به للبرمجيات الوسيطة
توثّق Microsoft الترتيب الموصى به. ويؤدي الخروج عنه إلى مشكلات يصعب تصحيحها. إليك الترتيب المعتمد لواجهة API مخصّصة للإنتاج في ASP.NET Core.
// Recommended order:
app.UseExceptionHandler(); // 1. Catch all exceptions
app.UseHsts(); // 2. HTTP Strict Transport Security
app.UseHttpsRedirection(); // 3. Redirect HTTP to HTTPS
app.UseStaticFiles(); // 4. Serve static assets
app.UseRouting(); // 5. Match route patterns
app.UseCors(); // 6. Cross-Origin
app.UseAuthentication(); // 7. Who are you?
app.UseAuthorization(); // 8. Are you allowed?
app.UseRateLimiter(); // 9. Throttle
app.UseOutputCache(); // 10. Cache responses
// Map endpoints here
app.MapControllers();
app.Run();معالجة الاستثناءات أولًا
يجب أن تكون برمجية معالجة الاستثناءات أول برمجية وسيطة، أي في الطبقة الخارجية، حتى تلتقط الاستثناءات الصادرة عن جميع البرمجيات الوسيطة ونقاط النهاية اللاحقة.
// Development: detailed error page
if (app.Environment.IsDevelopment())
app.UseDeveloperExceptionPage();
else
{
// Production: generic error page + structured response
app.UseExceptionHandler("/error");
app.UseHsts();
}
// OR: use ProblemDetails globally (recommended .NET 8+)
builder.Services.AddProblemDetails();
app.UseExceptionHandler();
// All unhandled exceptions -> RFC 7807 ProblemDetails JSONالملفات الثابتة قبل التوجيه
ينبغي أن تأتي الملفات الثابتة، مثل UseStaticFiles، قبل التوجيه. فتقديم ملف ثابت يوقف مسار التنفيذ مبكرًا، ولا حاجة إلى تشغيل المصادقة أو التوجيه من أجل /css/main.css.
app.UseStaticFiles(); // serves wwwroot/* without going through auth
app.UseRouting(); // expensive: runs route matching
// If you put UseStaticFiles AFTER UseRouting, the route
// matcher runs unnecessarily for every .js/.css request.
// Serve static files first for better performance.المصادقة قبل التخويل
يجب أن تأتي UseAuthentication قبل UseAuthorization. إذ تملأ المصادقة HttpContext.User، بينما يتحقق التخويل من هذا المستخدم بعد ملئه مقابل السياسات.
// WRONG ORDER — authorization runs before user is populated:
app.UseAuthorization(); // user is null → everything allowed!
app.UseAuthentication(); // too late
// CORRECT:
app.UseAuthentication(); // populates context.User
app.UseAuthorization(); // checks context.User against policiesCORS قبل المصادقة
يجب تشغيل البرامج الوسيطة لـ CORS قبل المصادقة، حتى تتم معالجة طلبات OPTIONS التمهيدية من دون الحاجة إلى ترويسات المصادقة.
builder.Services.AddCors(opts =>
opts.AddPolicy("Frontend", p =>
p.WithOrigins("https://myapp.com")
.AllowAnyHeader()
.AllowAnyMethod()));
app.UseRouting();
app.UseCors("Frontend"); // before auth — handles OPTIONS pre-flight
app.UseAuthentication();
app.UseAuthorization();البرامج الوسيطة المضمنة الشائعة
يأتي ASP.NET Core مزودًا بالعديد من مكونات البرامج الوسيطة المضمنة. يساعدك فهم وظيفة كل مكوّن على معرفة متى وكيفية استخدامه.
// Compression: compresses responses (must be before static files)
builder.Services.AddResponseCompression();
app.UseResponseCompression();
// Request localization: sets culture from Accept-Language header
builder.Services.AddLocalization();
app.UseRequestLocalization();
// Health checks: /health endpoint
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");
// Forwarded headers: trust X-Forwarded-For from reverse proxy
app.UseForwardedHeaders();تعمق في البرامج الوسيطة للتوجيه
تطابق UseRouting() الطلب الوارد مع نمط مسار وتخزّن نتيجة المطابقة في HttpContext. ثم تنفّذ UseEndpoints() (أو MapXxx()) نقطة النهاية المطابقة.
app.UseRouting(); // matches route, stores in context
// Between UseRouting and Map*: middleware can read route data
app.Use(async (ctx, next) =>
{
var endpoint = ctx.GetEndpoint();
var routeName = endpoint?.DisplayName;
Console.WriteLine($"Matched: {routeName}");
await next(ctx);
});
// All auth and other middleware go here
app.UseAuthentication();
app.UseAuthorization();
// Execute the matched endpoint
app.MapControllers();
app.MapGet("/", () => "Home");موضع ضغط الاستجابة
يجب أن يأتي ضغط الاستجابة قبل الملفات الثابتة والتوجيه، حتى تتم كتابة المخرجات المضغوطة قبل إنشاء المحتوى. ضعه مباشرةً بعد معالجة الاستثناءات.
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipelineتطبيق واقعي: خط أنابيب إنتاج كامل
خط أنابيب إنتاج كامل يجمع كل التوصيات في حزمة برامج وسيطة آمنة ومرتبة جيدًا.
var app = builder.Build();
if (app.Environment.IsDevelopment())
app.UseDeveloperExceptionPage();
else { app.UseExceptionHandler(); app.UseHsts(); }
app.UseResponseCompression();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowFrontend");
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();
app.MapHealthChecks("/health").AllowAnonymous();
app.MapControllers();
app.Run();تحقق سريع
لماذا يجب أن تأتي UseAuthentication قبل UseAuthorization في خط أنابيب البرامج الوسيطة؟
مراجعة: ترتيب البرامج الوسيطة والبرامج الوسيطة المضمنة
أهم النقاط:
- تأتي معالجة الاستثناءات أولًا، والملفات الثابتة قبل التوجيه، والمصادقة قبل التفويض، وCORS قبل المصادقة
- يُوضَع ضغط الاستجابة مبكرًا (قبل الملفات الثابتة) لتحقيق أقصى تأثير
- UseRouting + UseAuthorization + Map* — يمكن للبرامج الوسيطة الواقعة بينها قراءة بيانات المسار
- المضمنة: UseHsts وUseHttpsRedirection وUseStaticFiles وUseRateLimiter وUseOutputCache
- تحقق من
ctx.GetEndpoint()بين UseRouting وMapXxx لقراءة معلومات المسار المطابق
الأسئلة الشائعة
هل درس «ترتيب Middleware وMiddleware المضمّن» مجاني؟
نعم — نص درس «ترتيب Middleware وMiddleware المضمّن» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «ترتيب Middleware وMiddleware المضمّن»؟
افهموا الترتيب الصحيح لـ middleware الخاص بالمصادقة والتوجيه وCORS ومعالجة الاستثناءات. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «ترتيب Middleware وMiddleware المضمّن»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على مسار ASP.NET Core
- كتابة Middleware مخصّص
- الإيقاف المبكر والتفرّع
- ترتيب Middleware وMiddleware المضمّن