در نوشته های پیشین در مورد کلاس Startup و افزودن میان افزارها (Middleware) ها در متد ()Configure گفتیم. نام میان افزارها با Use آغاز می شود همانند ()UseHttpsRedirection و ()UseStaticFiles و ()UseRoutings و یا ()UseAuthorization و دیگر متدها که در ASP.NET Core شناسانده (تعریف) شده اند. 

میان افزار چیست

میان افزارها قطعه کدهایی یا بهتر است بگوییم متدهایی هستند که درخواست ها و پاسخ های HTTP را اداره می کنند. اگر دقت کرده باشید من در بخش بالایی، فهرست میان افزارها رابه ترتیبی که در کد هستند، آورده ام زیرا ترتیب فراخوانی متدهای میان افزار بسیار مهم است. متدهای میان افزار زنجیروار به دنبال یکدیگر افزوده می شوند و از این رو یک فرم لوله گونه (Pipeline) را می سازند و از این رو خروجی هر متد میان افزار پیشین به ورودی متد میان افزار پسین پیوند خورده است. در کد بالاو در متد ()Configure از بالا به پایین، این زنجیر ساخته شده است.

همانگونه که گفتیم متدهای میان افزار زنجیروار به یکدیگر پیوند خورده اند و یکی پس از دیگری انجلم می شوند ولی یک نکته دیگر نیز هست و این که، گاهی یم میان افزار باید پیش یا پس از دیگری افزوده شود. برای نمونه و بازهم بر پایه کد بالا، یک ترتیب میان، میان افزارها هست که در زیر ترتیب آنها را فهرست کرده ایم. برای نمونه اگر می خواهید میان افزار ()UseHttpsRedirection را به کار ببرید، آن باید پیش از ()UseStaticFiles و هر دو اینها پیش از ()UseRouting باشدو اگر می خواهید ()UseAuthorization را به کار ببرید، باید پیش از ()UseRouting افزوده شود.

  • ()UseHttpsRedirection
  • ()UseStaticFiles
  • ()UseRouting
  • ()UseAuthorization

بنابراین با میان افزارها می توانیم یک ترتیب (توالی) از کارها را بر روی درخواست ها و پاسخ ها انجام دهیم که هر میان افزار، پس میان افزار پیشین خود انجام می شود. برای نمونه یک میان افزار خطاها، دیگری فایل های ایستا (Static Files) و دیگری احراز هویت (Authentication) را انجام می دهد. شکل زیر نشان می دهد که درخواست ورودی شاید از چندین میان افزار و همچنین پاسخ نیز از توالی میان افزارها بگذرد.

Request Pipeline

در مستندات مایکروسافت مفهوم Request Pipeline شامل یک توالی از میان افزارها است که یکی پس از دیگری فراخوانی می شود و هر میان افزار یک عملیات را پیش از و پس از دیگری انجام می دهد. IApplicationBuilder کلاسی را تعریف می کند که مکانیزمی را برای پیکربندی Request Pipeline برنامه فراهم می کند و از این رو است که یکی از آرگومان های متد ()Configure از همین اینتفریس است.

در زمان این نوشته همچنان متستندات ASP.NET Core 3 به درستی آماده نشده است و برای همین در این پویند می توانید درباره IApplicationBuilder در API 2.2 بخوانید. اگر فهرست متدهای اینترفس را نگاه کنید، خواهید دید که متدهایی مانند ()UseMvc و یا ()UseStaticFiles را ببنید که اعضایی از این اینترفیس هستند. بنابراین زمانی که در متد ()Configure از کلاس Startup و به کمک پارامتر ورودی به نام app از نوع اینترفیس IApplicationBuilder، یکی از متدهای میان افزار را فراخوانی می کنید، در واقع یکی از اعضای IApplicationBuilder را فراخوانی کرده اید.

در زمان این نوشته همچنان متستندات ASP.NET Core 3 به درستی آماده نشده است و برای همین در این پویند می توانید درباره IApplicationBuilder در API 2.2 بخوانید. اگر فهرست متدهای اینترفس را نگاه کنید، خواهید دید که متدهایی مانند ()UseMvc و یا ()UseStaticFiles را ببنید که اعضایی از این اینترفیس هستند. بنابراین زمانی که در متد ()Configure از کلاس Startup و به کمک پارامتر ورودی به نام app از نوع اینترفیس IApplicationBuilder، یکی از متدهای میان افزار را فراخوانی می کنید، در واقع یکی از اعضای IApplicationBuilder را فراخوانی کرده اید.

متد ()Configure از کلاس Startup جایی است که میان افزارها افزوده می شوند و ترتیب اعمال میان افزارها به درخواست ورودی از بالا به پایین در این متد و ترتیب اعمال میان افزارها بر پاسخ خروجی، از پایین به بالا است که این را می توانید در شکل همین نوشته تشخیص دهید. توجه کنید این ترتیب برای امنیت، کارایی و هم برای کارکرد (عملکرد) برنامه مهم است. در زیر ترتیب افزوده شده میان افزارها نشان داده شده است.

  • در کد ()Configure از کلاس Startup نخست یکی از میان افزارهای ()UseDeveloperExceptionPage یا ()UseExceptionHandler افزوده شود. اگر محیط Development باشد، پس نخستین میان افزار وگرنه محیط Production است و دومین میان افزار، افزوده می شود. همچنین اگر محیط محیط Production باشد، پس میان افزار دیگر، ()UseHsts نیز افزوده می شود.
  • میان افزار ()UseHttpsRedirection برای هدایت (Redirection) کردن از درخواست HTTP به HTTPS فراخوانی می شود.
  • درباره فایل های ایستا (Static Files) در نوشته های پیش رو خواهیم گفت. در ادامه متد ()UseStaticFiles فراخوانی خواهد شد.
  • میان افزاری به نام ()UseCookiePolicy فراخوانی می شود. این متد مقررات عمومی حفاظت از داده اتحادیه اروپا یا GDPR (کوتاه شده General Data Protection Regulation) را اعمال می کند.
  • سپس متد ()UseRouting فراخوانی می شود. 
  • احراز هویت کردن برای آن است که برنامه بفهمد آیا درخواست مجاز دسترسی به منبع است یا نه؟ احراز هویت کاربر توسط میان افزار ()UseAuthentication انجام می شود.
  • پس از آنکه احراز هویت انجام شد، می بایست مشخص شود سطح دسترسی کاربر چیست که این را Authorization می گویند و برای آن میان افزار ()UseAuthorization فراهم شده است.
  • سپس میان افزار ()UseSession فراخوانی می شود.
  • سپس میان افزار ()UseEndpoints فراخوانی می شود. گفتیم که این متد با ()UseMvc در ASP.NET Core 3 جایگزین شده است. درون ()UseEndpoints متدی (نه میان افزار) به نام ()MapRazorPages فراخوانی می شود.

در کد زیر متد ()Configure تنها یک رودی به نام app از اینترفیس IApplicationBuilder دریافت می کند و بر پایه ترتیب بالا تنها برخی از میان افزارها به نام ()UseStaticFiles و سپس ()UseResponseCompression سپس ()UseEndpoints را فراخوانی می کند. پیش از این گفتیم که در فایل Startup.cs از ASP.NET Core MVC 3 متد ()Configure میان افزار ()UseEndpoints را برای نشان دادن الگو مسیر به کار می برد.