در این مقاله مطالب زیر را بررسی می کنیم
پیکربندی middleware ها در asp.net core
استفاده از چندین 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 در وب اپلیکیشن های asp.net core وجود دارد. این middleware ها می تواند از middleware های ارائه شده توسط framework باشد و یا middleware های اختصاصی که خود ما ایجاد می کنیم. ما می توانیم ترتیب اجرای middleware ها رو تغییر دهیم پس در نتیجه هنگام نوشتن کد ها باید به این ترتیب دقت کنیم. معمولا از بالا به پایین middleware ها اجرا می شوند.
هر middleware می تواند درخواست http را تغییر دهد و یا چیزی به آن اضافه کند، و کار را به Middleware های بعدی تحویل بدهد تا اینکه سرانجام درخواست به فریم ورک mvc برسد. Middleware ها دقیقا همانند الگوی طراحی زنجیره ی مسئولیت عمل می کنند در تصویر زیر می توانید نحوه کارکرد middleware ها را به خوبی ببینید.
Middleware ها pipeline درخواست های برنامه را پیاده سازی می کنند. در تصویر زیر نحوه فرایند درخواست های برنامه های Asp.Net Core را می بینیم که Middleware ها هم بخشی از آن هستند.
در ویدیو زیر بیشتر با 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 به صورت زیر برای ما ساخته می شود.
// 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 ها را بررسی کرده ایم و می توانید از آن استفاده نمایید.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید