Introduction Into ASP.NET Core Middleware

الـ Middleware هو مكون برمجي في تطبيقات ASP.NET Core يتعامل مع الطلبات (Requests) القادمة من العميل ويقوم بتنفيذ عمليات مختلفة على هذه الـ Requests قبل أن تصل إلى الـ Controller أو قبل أن يتم إرسال الاستجابة إلى العميل.
Introduction Into ASP.NET Core Middleware
Introduction Into ASP.NET Core Middleware

في هذه الصفحة

المقدمة

الـ Middleware هو مكون برمجي في تطبيقات ASP.NET Core يتعامل مع الطلبات (Requests) القادمة من العميل ويقوم بتنفيذ عمليات مختلفة على هذه الـ Requests قبل أن تصل إلى الـ Controller أو قبل أن يتم إرسال الاستجابة إلى العميل.

ببساطة، هو مكون يمر عبره كل طلب (Request) يتم استلامه من العميل (Client) قبل أن يصل إلى التطبيق (Application) أو بعد معالجته، حيث يمكنه تعديل الطلب أو الاستجابة أو إجراء عمليات إضافية مثل التحقق من الهوية أو معالجة الأخطاء.


أهمية Middleware

  1. إضافة وظائف مشتركة: يمكن استخدام الـ Middleware لإضافة وظائف متكررة في كل الطلبات مثل التحقق من الهوية، السجل (Logging)، معالجة الأخطاء، أو إضافة HTTP Headers معينة.
  2. التنظيم المركزي: بدلاً من كتابة الكود نفسه في كل مكان داخل التطبيق، يمكن وضعه في مكان واحد لتبسيط الصيانة والتطوير.

أنواع مختلفة من الـ Middleware في ASP.NET Core

Authentication Middleware

يُستخدم للتحقق من هوية المستخدم بناءً على معلومات الطلب (مثل الـ Token في الـ HTTP Header). ويتم استخدامه في الغالب مع بروتوكولات مثل OAuth أو JWT.

مثال:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    app.UseAuthentication(); // التحقق من الهوية
    app.UseAuthorization(); // التأكد من الصلاحيات
}

Authorization Middleware

يتم استخدامه بعد الـ Authentication لضمان أن المستخدم لديه الصلاحيات المناسبة للوصول إلى الموارد.

مثال:

[Authorize(Roles = "Admin")]
public IActionResult GetAdminData() {
    return Ok("This is admin data.");
}

Logging Middleware

يُستخدم لتسجيل تفاصيل الطلبات مثل عنوان URL، طريقة الطلب (GET, POST، إلخ)، وأي بيانات إضافية يمكن أن تكون مفيدة لتشخيص الأخطاء أو مراقبة الأداء.

مثال:

public class LoggingMiddleware {
    private readonly RequestDelegate _next;

    public LoggingMiddleware(RequestDelegate next) {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context) {
        Console.WriteLine($"Request: {context.Request.Method} {context.Request.Path}");
        await _next(context);
    }
}

ثم يمكنك إضافة الـ Logging Middleware في Startup.cs كما يلي:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    app.UseMiddleware<LoggingMiddleware>();
    app.UseRouting();
}

تقدروا دلوقتي تشتركوا في النشرة الأسبوعية لاقرأ-تِك بشكل مجاني تمامًا عشان يجيلكوا كل جديد بشكل أسبوعي فيما يخص مواضيع متنوعة وبشروحات بسيطة وسهلة وبجودة عالية 🚀

النشرة هيكون ليها شكل جديد ومختلف عن شكلها القديم وهنحاول انها تكون مميزة ومختلفة وخليط بين المحتوى الأساسي اللي بينزل ومفاجآت تانية كتير 🎉

Eqraatech Newsletter | Eqraatech - اقرأ-تِك | Substack
محتوى تقني متميز في مختلف مجالات هندسة البرمجيات باللغة العربية عن طريق تبسيط المفاهيم البرمجية المعقدة بشكل سلس وباستخدام صور توضيحية مذهلة. Click to read Eqraatech Newsletter, a Substack publication with hundreds of subscribers.

بفضل الله قمنا بإطلاق قناة اقرأ-تِك على التليجرام مجانًا للجميع 🚀

آملين بده اننا نفتح باب تاني لتحقيق رؤيتنا نحو إثراء المحتوى التقني باللغة العربية ، ومساعدة لكل متابعينا في انهم يوصلوا لجميع أخبار اقرأ-تِك من حيث المقالات ومحتوى ورقة وقلم والنشرة الأسبوعية وكل جديد بطريقة سريعة وسهلة

مستنينكوا تنورونا , وده رابط القناة 👇

https://t.me/eqraatechcom


Custom Middleware for Caching

يمكن أن تُستخدم الـ Middleware لتنفيذ عمليات متعلقة بالـ Cache، مثل تخزين استجابات معينة في الذاكرة (Memory) لتسريع الوصول إليها.

مثال:

public class CachingMiddleware {
    private readonly RequestDelegate _next;

    public CachingMiddleware(RequestDelegate next) {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context) {
        var cacheKey = context.Request.Path.ToString();
        var cachedResponse = Cache.Get(cacheKey); // محاولة جلب البيانات من الكاش
        if (cachedResponse != null) {
            context.Response.ContentType = "application/json";
            await context.Response.WriteAsync(cachedResponse);
            return;
        }
        await _next(context);
    }
}

كيفية إضافة Middleware في ASP.NET Core

يمكنك إضافة الـ Middleware في ملف Startup.cs باستخدام الطريقة

app.UseMiddleware<MiddlewareType>();

ومن المهم ترتيب الـ Middleware بالشكل الصحيح حيث يؤثر الترتيب في كيفية معالجة الطلبات.


مثال على إضافة Middleware للتعامل مع الأخطاء

تعريف الـ Middleware:

public class ErrorHandlingMiddleware {
    private readonly RequestDelegate _next;

    public ErrorHandlingMiddleware(RequestDelegate next) {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context) {
        try {
            await _next(context); // تمرير الطلب إلى الـ Middleware التالي
        } catch (Exception ex) {
            context.Response.StatusCode = 500; // تعيين حالة الخطأ
            await context.Response.WriteAsync("An unexpected error occurred!"); // إرسال استجابة للمستخدم
            Console.WriteLine($"Error: {ex.Message}"); // تسجيل الخطأ
        }
    }
}

إضافة الـ Middleware إلى Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    app.UseMiddleware<ErrorHandlingMiddleware>(); // إضافة الـ Middleware
    app.UseRouting(); // تحديد مسار الطلبات
    app.UseAuthentication(); // التحقق من الهوية
    app.UseAuthorization(); // تحديد صلاحيات الوصول
}

أفضل الممارسات لاستخدام Middleware

  1. ترتيب الـ Middleware: يجب ترتيب الـ Middleware بعناية خاصة إذا كان بعضها يعتمد على الآخر. على سبيل المثال، يجب أن يأتي الـ Authentication Middleware قبل الـ Authorization Middleware.
  2. أداء التطبيق: تجنب إضافة الكثير من الـ Middleware الثقيلة في السلسلة لأنها يمكن أن تؤثر سلبًا على أداء التطبيق. حاول أن تبقي السلسلة بسيطة وفعالة قدر الإمكان.
  3. التعامل مع الأخطاء: يفضل استخدام Middleware للتعامل مع الأخطاء، مثل إعادة إرسال استجابة موحدة عند حدوث خطأ غير متوقع.
  4. إعادة استخدام الـ Middleware: لا تكرر نفس الكود في عدة أماكن. استخدم Middleware في أماكنها المناسبة لتقليل التكرار.
  5. مراعاة الأمان: تأكد من إضافة Middleware متعلقة بالأمان مثل التحقق من الهوية والصلاحيات في البداية. هذا يساعد في الحماية ضد الهجمات.
  6. اختبار الأداء: تأكد من أن الـ Middleware لا يؤدي إلى تأثير سلبي على أداء التطبيق من خلال مراقبة التأخيرات في الوقت.

كيفية إضافة Middleware مخصص مع بيانات إضافية

أحيانًا تحتاج إلى تمرير معلومات إضافية إلى Middleware. يمكن القيام بذلك باستخدام HttpContext.Items أو من خلال إضافة Objects مخصصة إلى الـ Request.

مثال: إضافة بيانات مخصصة إلى الـ Request:

public class CustomDataMiddleware {
    private readonly RequestDelegate _next;

    public CustomDataMiddleware(RequestDelegate next) {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context) {
        // إضافة بيانات مخصصة إلى الطلب
        context.Items["RequestTime"] = DateTime.UtcNow;
        await _next(context);
    }
}
public class HomeController : Controller {
    public IActionResult Index() {
        var requestTime = HttpContext.Items["RequestTime"];
        return Ok($"Request time was: {requestTime}");
    }
}

حذف Middleware

في بعض الحالات، قد تحتاج إلى إزالة أو تعطيل Middleware معين في بيئة معينة (مثل بيئة التطوير أو الإنتاج). يمكن فعل ذلك عبر شرط في Configure في ملف Startup.cs.

مثال: تعطيل Middleware في بيئة معينة

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage(); // تشغيل صفحة الأخطاء في بيئة التطوير
    }
    else {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts(); // استخدام HSTS في بيئة الإنتاج
    }

    app.UseRouting();
}

اشترك الآن بنشرة اقرأ-تِك الأسبوعية

لا تدع أي شيء يفوتك. واحصل على أحدث المقالات المميزة مباشرة إلى بريدك الإلكتروني وبشكل مجاني!