ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

۱۲ قانون طلایی در ترتیب Middlewareها در ASP.NET Core

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<RequestLoggingMiddleware>();

				
			

📝 برای ثبت کامل درخواست از ابتدا تا انتها.

۹. Middlewareهای Context Modifier باید زود ثبت شوند

				
					app.UseMiddleware<CultureMiddleware>();

				
			

🌍 مثلاً 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 دارید، همین‌جا بپرسید!🚀

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *