
Middleware در ASP.NET Core جزء جدانشدنی معماری درخواست (HTTP Request Pipeline) است. با رعایت ترتیب صحیح middlewareها میتوان از مشکلات امنیتی، کندی سیستم یا عدم پاسخدهی جلوگیری کرد.
در این مقاله آموزش دات نت کور (ASP CORE) به زبان ساده، ۱۲ قانون ضروری در ترتیب Middlewareها را بههمراه مثالهای کاربردی بررسی میکنیم.
آیا میدانستید ترتیب اشتباه middlewareها میتواند باعث شود authorization، static files یا even routing کار نکند؟
اگر می خواهید در آموزش برنامه نویسی Core با انواع فیلترها بیشتر و عمیق تر آشنا بشید، پیشنهاد می شود نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
Middleware چیست؟
Middleware در ASP.NET Core کامپوننتهایی هستند که در مسیر پردازش درخواست و پاسخ (HTTP Pipeline) قرار میگیرند. هر middleware میتواند:
- درخواست را پردازش یا مسدود کند
- به middleware بعدی اجازه عبور دهد (
await next()) - پاسخ را قبل از ارسال تغییر دهد
📌 چرا ترتیب Middleware اهمیت دارد؟
ترتیب اجرای middlewareها، مسیر پردازش درخواستها را مشخص میکند. ترتیب اشتباه میتواند باعث:
- عدم شناسایی کاربر (authentication)
- رد شدن مجوزها (authorization)
- لود نشدن فایلهای استاتیک
- اجرا نشدن routeها
- نمایش خطاهای خام به کاربر
🔢 ۱۲ قانون مهم در ترتیب Middleware در ASP.NET Core
۱. اجرای Middlewareها به ترتیب ثبت در pipeline است
app.Use(async (context, next) =>
{
Console.WriteLine("Middleware 1 Start");
await next();
Console.WriteLine("Middleware 1 End");
});
app.Use(async (context, next) =>
{
Console.WriteLine("Middleware 2 Start");
await next();
Console.WriteLine("Middleware 2 End");
});
✅ نتیجه در Console:
Middleware 1 Start
Middleware 2 Start
Middleware 2 End
Middleware 1 End
۲. UseRouting باید قبل از UseAuthorization باشد
app.UseRouting();
app.UseAuthorization(); // barrasi mojavez users
🔍 بدون UseRouting، authorization نمیداند با کدام endpoint سروکار دارد.
۳. UseAuthentication باید قبل از UseAuthorization اجرا شود
app.UseAuthentication(); // shenasaei user
app.UseAuthorization(); // barrasi dastresi
❌ اگر جای آنها را عوض کنید، کاربر ناشناخته باقی میماند.
۴. UseEndpoints باید آخرین middleware routing باشد
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
🚫 بعد از UseEndpoints نباید middlewareهای مربوط به routing بیایند.
۵. Middleware هندلینگ خطا در ابتدای pipeline باشد
app.UseExceptionHandler("/error"); // ba custom middleware
🧠 این middleware باید تمامی خطاها را از ابتدا ثبت کند.
۶. UseStaticFiles باید قبل از routing باشد
app.UseStaticFiles();
app.UseRouting();
📁 فایلهای استاتیک نیازی به routing ندارند، پس بهتر است زودتر لود شوند.
۷. UseCors باید قبل از routing و authorization باشد
app.UseCors("AllowAll");
app.UseRouting();
🌐 در غیر این صورت headerهای CORS ارسال نمیشوند.
۸. Middlewareهای Log و Telemetry در ابتدای pipeline
app.UseMiddleware();
📝 برای ثبت کامل درخواست از ابتدا تا انتها.
۹. Middlewareهای Context Modifier باید زود ثبت شوند
app.UseMiddleware();
🌍 مثلاً culture یا tenant را تعیین میکنند، قبل از routing نیاز به اجرا دارند.
۱۰. UseResponseCompression باید قبل از static و dynamic response باشد
app.UseResponseCompression();
app.UseStaticFiles();
📦 تا responseهای مختلف فشردهسازی شوند.
۱۱. Middlewareهای ترمینال مانند app.Run باید آخر باشند
app.Run(async context =>
{
await context.Response.WriteAsync("Hello World");
});
⚠️ اگر این middleware زود اجرا شود، هیچ middleware بعدی اجرا نخواهد شد.
۱۲. ترتیب داخلی در Map و UseWhen نیز مهم است
app.Map("/admin", adminApp =>
{
adminApp.UseAuthentication();
adminApp.UseAuthorization();
adminApp.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
});
🛠 هر بخش از pipeline ساختار ترتیب مستقل خودش را دارد
سوالات متداول درباره Middlewareها در ASP.NET CORE
چون ترتیب اجرای middlewareها تعیین میکند که چه کدی قبل یا بعد از چه چیزی اجرا شود.
مثلا اگر UseAuthentication بعد از UseAuthorization قرار گیرد، کاربر ناشناخته باقی میماند و دسترسی به منابع denied میشود.
یا اگر UseStaticFiles بعد از UseRouting بیاید، فایلهای استاتیک ممکن است هرگز لود نشوند.
Use: رایجترین متد برای اضافه کردن middlewareهایی که میخواهند درخواست را عبور دهند (await next()).Run: یک Terminal Middleware است که pipeline را خاتمه میدهد (بدونnext()).Map: مسیر را جدا میکند و یک بخش pipeline جدید میسازد (مثلاًapp.Map("/admin", ...)).
اگر middlewareها به درستی چیده نشده باشند، مشکلاتی مانند زیر رخ میدهد:
- دسترسیها نادرست مدیریت میشوند
- exceptionها به کاربر نمایش داده میشوند
- routeها resolve نمیشوند
- فایلهای استاتیک لود نمیشوند
- برخی middlewareها اجرا نمیشوند (مثلاً بعد از
app.Run)
بله. میتوان با استفاده از Map, MapWhen, و UseWhen middlewareها را فقط در مسیر یا شرایط خاصی اجرا کرد.
app.UseWhen(context => context.Request.Path.StartsWithSegments(“/admin”), adminApp =>
{
adminApp.UseMiddleware<AdminMiddleware>();
});
🎯 نتیجهگیری
Middlewareها ستون فقرات معماری درخواست در ASP.NET Core هستند.
اما اجرای صحیح آنها تنها با رعایت ترتیب درست ممکن است. با رعایت این ۱۲ قانون و استفاده از مثالهای بالا، میتوانید pipeline خود را بهینه، امن، سریع و قابل اطمینان کنید.
📢 مقاله را مفید دیدید؟ برای همکارانتان بفرستید. یا اگر سوالی درباره Middlewareها در ASP.NET CORE دارید، همینجا بپرسید!🚀
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید