آشنایی با middleware در asp.net core

آشنایی با middleware در asp.net core
فهرست مقاله [نمایش]

      middleware in asp.net core

     

    در این مقاله مطالب زیر را بررسی می کنیم

    Middleware چیست؟

    پیکربندی middleware ها در asp.net core

    متد Run چگونه کار می کند؟

    استفاده از چندین middleware در asp.net core

    معرفی middleware های داخلی asp.net core

    نحوه استفاده از Diagnostics middleware

    انوع middleware در asp.net core

    ساخت middleware سفارشی در برنامه های asp.net core

    افزودن Middleware سفارشی به pipeline برنامه در Asp.Net Core

    Middleware چیست؟

    در asp.net core مفهوم جدیدی با نام middleware  (میدل ویر یا میان افزار) معرفی شد. Middleware یک کامپوننت است که با هر درخواستی که به برنامه های asp.net core ارسال می شود این کامپوننت ها اجرا می شوند. در واقع با استفاده از middleware ها میتوانیم pipeline یا خط لوله ی درخواست های برنامه های asp.net core را طراحی کنیم.

    در برنامه های قدیمی Asp.Net وظیفه ی این کار بر عهده ی HttpHandlers و HttpModules بود و در asp.net core این middleware ها هستند که کار httphandlers و httpmodules را انجام می دهند و PipeLine درخواست های وب را شکل می دهند.

    در دوره رایگان آموزشasp در موردمیدل ویرها بیشتر صحبت کرده ایم.

     

     

     middleware in  asp.net core

     به طور معمول بیش از یک middleware در وب اپلیکیشن های asp.net core   وجود دارد. این middleware ها می تواند از middleware های ارائه شده توسط framework باشد و یا middleware های اختصاصی که خود ما ایجاد می کنیم. ما می توانیم ترتیب اجرای middleware ها رو تغییر دهیم پس در نتیجه هنگام نوشتن کد ها باید به این ترتیب دقت کنیم. معمولا از بالا به پایین middleware ها اجرا می شوند.

    هر middleware می تواند درخواست http را تغییر دهد و یا چیزی به آن اضافه کند، و کار را به Middleware های بعدی تحویل بدهد تا اینکه سرانجام درخواست به فریم ورک mvc برسد. Middleware ها دقیقا همانند الگوی طراحی زنجیره ی مسئولیت عمل می کنند در تصویر زیر می توانید نحوه کارکرد middleware ها را به خوبی ببینید.

     

     middleware in   asp.net core

     

    Middleware ها pipeline درخواست های برنامه را پیاده سازی می کنند. در تصویر زیر نحوه فرایند درخواست های برنامه های Asp.Net Core را می بینیم که Middleware ها هم بخشی از آن هستند.

     

     middleware in asp.net core

     

    در ویدیو زیر بیشتر با middleware ها اشنا بشوید

     

     

     

    پیکربندی middleware ها در asp.net core

    پیکربندی middleware ها رو با متد Configure در کلاس Startup با استفاده از نمونه ای که از اینترفیس IApplicationBuilder  ایجاد میکنیم انجام می دهیم. در مثالی که در ادامه می بینیم با استفاده از متد Run رشته ی Hello World! را خروجی هر درخواست نمایش می دهیم.

    public class Startup
    {
        public Startup()
        {
        } 
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            //configure middleware using IApplicationBuilder here..
                
            app.Run(async (context) =>
            {              
                await context.Response.WriteAsync("Hello World!");
                  
            });
    
            // other code removed for clarity.. 
        }
    }

     

    متد Run()  یک اکستنشن متد از اینستنس IApplicationBuilder است که یک Middleware به pipeline برنامه اضافه کرده است. این middleware بر روی هر درخواستی که به سمت وب اپلیکیشن ما بیاید تاثیر می گذارد و رشته ی “Hello World!” را در خروجی نمایش می دهد.

     

    متد Run چگونه کار می کند؟ 

    ما با استفاده از اکستنشن متد Run()می توانیم Middleware ها را به PipleLine اضافه کنیم. در کد زیر امضای متد Run() را می بینیم.

    public static void Run(this IApplicationBuilder app, RequestDelegate handler)
    

    متد Run() یک اکستنشن متد از IAplicationBuilder می باشد علاوه بر دریافت یک نمونه از این اینترفیس یک پارامتر دیگر از نوع RequestDelegate دریافت می کند. RequestDelegate با استفاده از یک متد delegate درخواست ها را هندل میکند. در کد زیر امضای RequestDelegate رو می بینیم.

    public delegate Task RequestDelegate(HttpContext context);
    

    همانطور که در قطعه کد بالا دیدیم، متد Run پارامتری را به عنوان ورودی دریافت می کند که با امضای RequestDelegate مطابقت داشته باشد. پس در نتیجه این متد یک پارامتر از نوع httpContext دریافت می کند و خروجی Task را برمیگرداند. بنابراین با عبارات لامبدا می توانیم از متد Run() برای ساخت Middleware جدید استفاده کنیم و یا اینکه یک متد دیگر را در متد Run() صدا بزنیم. در قطعه کد بالا با استفاده از عبارات لامبدا از متد Run() استفاده کردیم و در کد زیر با استفاده از فراخوانی یک متد این کار را انجام می دهیم.

    public class Startup
    {
        public Startup()
        {
        } 
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
             app.Run(MyMiddleware);
        }
    
        private Task MyMiddleware(HttpContext context) 
        {
            return context.Response.WriteAsync("Hello World! ");
        }
    }

    MyMiddleware در کد بالا به صورت asynchronous نیست و تا زمان اتمام اجرای آن برنامه قفل می شود. می توانیم با کلمه ی async آن را asynchronous کنیم وعملکرد را بالاتر ببریم.

    // other code removed for clarity
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
         app.Run(MyMiddleware);
    }
    
    private async Task MyMiddleware(HttpContext context) 
    {
        await context.Response.WriteAsync("Hello World! ");
    }

     

     

    استفاده از چندین middleware در asp.net core

    در وب اپلیکیشن های Asp.Net Core معمولا بیشتر از یک middleware وجود دارد که به صورت متوالی و پشت سر هم اجرا می شوند. متد Run()  یک middleware به برنامه اضافه می کند ولی middleware بعدی را مشخص نمی کند که از آن استفاده شود. به کد زیر دقت کنید همیشه اولین middleware اجرا می شود و هرگز middleware های بعدی اجرا نمی شوند.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World From 1st Middleware"); 
        });
        
        // the following will never be executed
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World From 2nd Middleware"); 
        });
    }

    برای استفاده از چندین middleware باید از متد Use() استفاده کنیم. این متد شبیه به متد Run() عمل می کند با این تفاوت که middleware بعدی را نیز اجرا می کند.

    به مثال زیر توجه کنید.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Use(async (context, next) =>
        {
            await context.Response.WriteAsync("Hello World From 1st Middleware!");
    
            await next();
        });
    
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World From 2nd Middleware"); 
        });
    }

    بنابراین با متد Use() می توانیم چندین middleware را استفاده کنیم.

     

    معرفی middleware های داخلی asp.net core

    Core یک فریم ورک ماژولاراست و ما میتوانیم فیچرهای سمت سروری که نیاز داریم را از طریق nugget دریافت و نصب کنیم. Middleware های خیلی زیادی بر روی nugget وجود دارد که توسط مایکروسافت و دیگر شرکت ها ارائه شده است که می توانیم در برنامه های خود از آنها استفاده کنیم. در جدول زیر برخی از این middleware ها رو می بینیم.

    Middlewareتوضیحات
    Authenticationقابلیت احراز هویت کاربران را به برنامه اضافه می کند.
    CORSانجام تنظیمات Cross-Origin  برای اشتراک منابع را انجام می دهد
    Routingسیستم مسیریابی را به برنامه اضافه می کند
    Sessionقابلیت پشتیبانی از user session را به برنامه اضافه می کند.
    StaticFilesبه برنامه اجازه می دهد که از فایل های بر روی سرور استفاده کند
    Diagnosticsقابلیت گزارش و هندل خطاها را به برنامه اضافه می کند
    Swaggerامکان تهیه داکیومنت های خودکار برای Api ها را فراهم می کند

    در ادامه نحوه ی استفاده از miidleware diagnostics بررسی می کنیم.

     

     

    نحوه استفاده از استفاده از Diagnostics middleware

     

    با استفاده از دستور زیر پکیج Duagnostics را بر روی برنامه نصب نمایید. از این middleware برای گزارش دادن و رسیدگی به exeption ها و خطا ها در Asp.Net Core و تشخیص خطاهای EF Core در هنگام migration کردن مورد استفاده قرار می گیرد.

    Install-Package Microsoft.AspNetCore.Diagnostics 

    این پکیج شامل midelleware و متدهای  توسعه یافته ای است برای استفاده از آن در جدول متد های این middleware را توضیح داده ایم.

    توضیحاتمتد
    با استفاده از این متد هنگام رخ دادن خطا اطلاعاتی در مورد exception ها و خطاها در قالب html به کاربر نمایش می دهد.UseDeveloperExceptionPage()
    Exception های رخ داده را مدیریت می کند.UseExceptionHandler()
    در صورت وجود خطا فقط کد خطا از 400 تا 599 را برمیگرداندUseStatusCodePages()
    صفحه html خوش آمدگویی را در آدرس ریشه ی برنامه نمایش می دهد.UseWelcomePage()

     

    انوع middleware در Asp.Net Core

    در برنامه های Asp.Net Core چهار  نوع middleware داریم که در ادامه به معرفی انواع middleware در asp.net core می پردازیم.

    Content-Generating یا تولید کننده ی محتوا

    Short-Circuiting یا قطع کننده ی اتصال

    Request-Editing یا ویرایشگر درخواست

    Respons-Editing یا ویرایشگر پاسخ

     

    ساخت middleware سفارشی در برنامه های asp.net core

     

    در ادامه نحوه ی ساخت middleware های سفارشی و استفاده از آن در برنامه ی های Asp.Net Core را آموزش می دهیم.

    برای ساخت middleware سفارشی از کلاس های معمولی .Net استفاده می کنیم. این کلاس حتما باید دارای متدی با نام Invoke() باشد. و برای اجرای middleware بعدی باید دارای پارامتری از نوع RequestDelegate در متد سازنده کلاس باشد.

    Visual Stadio یک تمپلیت برای ایجاد Middleware های استاندارد دارد که همانند تصویر زیر می توانیم از آن استفاده نماییم. فقط کافیست در قسمت جستجو کلمه middleware را جستجو نمایید.سپس آیتم Middleware Class را انتخاب و نام مورد نظر را وارد نمایید . کلاس middleware به صورت زیر برای ما ساخته می شود.

     

      انیمیشن افزودن کلاس middleware در visual stadio 2019

    // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
    public class MyMiddleware
    {
        private readonly RequestDelegate _next;
    
        public MyMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public Task Invoke(HttpContext httpContext)
        {
    
            return _next(httpContext);
        }
    }
    
    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class MyMiddlewareExtensions
    {
        public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MyMiddleware>();
        }
    } 

    در داخل متد Invoke() می توانیم کدهای Middleware خودمان را بنویسم به نمونه ی زیر توجه نمایید.

    public class MyMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
    
        public MyMiddleware(RequestDelegate next, ILoggerFactory logFactory)
        {
            _next = next;
    
            _logger = logFactory.CreateLogger("MyMiddleware");
        }
    
        public async Task Invoke(HttpContext httpContext)
        {
            _logger.LogInformation("MyMiddleware executing..");
    
            await _next(httpContext); // calling next middleware
    
        }
    }
    
    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class MyMiddlewareExtensions
    {
        public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MyMiddleware>();
        }
    }

     

     

    افزودن Middleware سفارشی به pipeline برنامه در Asp.Net Core

    با استفاده از اکستنشن متدی که در کلاس middleware ایجاد شد می توانیم middleware را به pipeline برنامه اضافه کنیم.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {   
        app.UseWelcomePage(); 
         
    }

    همچنین با استفاده از متد UseMiddleware که از متد های IApplicationBuilder است می توانیم این کار را انجام دهیم.

    برای کسب اطلاعات بیشتری می توانید دوره آموزش asp.net core مقدماتی را دانلودکنید، این دوره رایگان است و در آن مباحث بیشتری از middleware ها را بررسی کرده ایم و می توانید از آن استفاده نمایید.  


    • نویسنده: احسان بابائی

    ارسال دیدگاه

    برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربری‌تان شوید


    دیدگاه کاربران

    avatar
    اردشیر لک
    1402/11/13

    عالی عالی عالی ....

    avatar
    احسان بابائی
    1402/11/13

    زنده باشید جناب لک🌹


    avatar
    علی یگانه
    1399/02/26

    عاااااالی بود اقا احسان

    ممنون که وقت میزارین این اموزش ها رو تهیه می کنید


    avatar
    حمید محمدی
    1399/01/09

    عالی بود این آموزش از Middleware ها.

    در دوره ی آموزشی asp.net core بخش middleware نزدیک به 1 ساعت توضیح دادین که این خیلی عالی بود و من کامل با مفهوم middleware ها در asp.net core آشنا شدم.

    تشکر از شما و همکارانتون امیدوارم بازم از این آموزش ها از سایت باگتو ببینیم