همانند هر برنامه سی شارپ دیگری، فایل Program.cs نقطه ورود به برنامه است. این فایل دارای یک کلاس همنام و یک متد به نام ()Main است. پیش از این درباره کلاس Startup گفتیم که پیکربندی آغازین پروژه را انجام می دهد. کلاس Startup دارای دو متد ()ConfigureServices و ()Configure است که پیش فرض در یک کلاس به نام Startup و در فایل Startup.cs نوشته شده است. در کدهای درون فایل Program.cs باید نام کلاس Startup مشخص شود.

ساخت میزبان

در کنار اینکه کلاس Program و متد ()Main آن نقطه ورود به برنامه است، این کلاس دارای متد دیگری به نام ()CreateHostBuilder است که کاربرد آن ساخت یک میزبان است. همچنین در این متد کلاس Startup فراخوانی می شود. میزبان یک شی است که منابع یک برنامه وب ASP.NET Core MVC را کپسوله سازی می کند. 

میزبان ها دو دسته ۱) Generic Host و ۲) Web Host هستند که از میان این دو Generic Host پیشنهاد می شود. در کد زیر و درون متد ()CreateHostBuilder دو متد دیگر به نام ()CreateDefaultBuilder و ()ConfigureWebHostDefaults زنجیروار فراخوانی می شوند. این دو متد با یکدیگر یک میزبان را با برخی از ویژگی های زیر پیکربندی می کنند:

  • Krestal را به عنوان وب سرور پیش فرض استفاده می کند، همراه یکپارچگی با IIS. اگر به یاد داشته باشید گفتیم که برای کاربردهای مانند Windows Authentication باید Krestal با IIS ادغام شود.
  • وظیفه میزبان است تا پیکربندی های گوناگون را از بخش های گوناگون همانند فایل appsettings.json یا متغیرهای محیطی بارگذاری کند.
  • یکی دیگر از وظایف میزبان فرستادن پیعام های لاگ به کنسول (خط فرمان) است. برای نمونه کدهای وضعیت HTTP مانند کد ۲۰۰ برای موفق بودن بارگذاری یک برگه یا کد ۴۰۴ برای ناموفق بودن و پیدا نکردن یک برگه را نشان می دهد. همچنین کدهای دیباگ برنامه نیز نشان داده می شود.

یک میزبان به طور معمول بدست کدهای درون کلاس Program پیکربندی، ساخته و اجرا می شود. در آغاز متد ()Main اجرا می شود و در آن متد دیگری به نام ()CreateHostBuilder فراخوانی می شود که یک شی IHostBuilder را می سازد. سپس زنجیروار، متدهای ()Build و ()Run از اینترفیس IHostBuilder فراخوانی می شوند.

متد CreateDefaultBuilder

در متد ()CreateHostBuilder برای ساخت میزبان، نخست متد ()CreateDefaultBuilder فراخوانی می شود که ورودی آن یک آرایه از رشته ها است که در کد زیر، متغیر args به آن فرستاده شده است. در زیر همه گام ها و کارهایی که این متد برای ساخت و راه اندازی میزبان انجام می دهد فهرست شده است:

  • متغیر content root را با مقدار برگشتی متد ()GetCurrentDirectory مقداردهی می کند. متد ()GetCurrentDirectory از فضای نام System.IO است و مسیر دایرکتوری جاری را برگشت می دهد.
  • گفتیم که باید پیکربندی ها از جاهای گوناگون بارگذاری شوند و از این رو متد ()CreateHostBuilder متغیرهای محیطی با پیشوند _DOTNET را فراخوانی می کنند. متغیرهای محیطی، متغیرهایی هستند که در سیستم عامل شناسانده (نعریف) می شوند و سپس می توان از درون دیگر برنامه ها (کدهای زبان های برنامه نویسی) آنها را خوانده و مقدارشان را بدست آورد.
  • در ادامه بارگذاری پیکربندی ها، فایل appsettings.json نیز خوانده می شود.
  • همانگونه که گفتیم پیغام های لاگ باید بر روی کنسول (خط فرمان) نوشته شوند و فراهم کننده (نمایش و درج) لاگ به کمک این متد آماده می شود.
  • اگر محیط Development باشد، پس دو ویژگی Scope Validation و Dependency Validation فعال می شوند. این دو مربوط به تزریق وابستگی هستند و در نوشته مربوط به تزریق وابستگی توضیح داده شده اند.

متد ConfigureWebHostDefaults

متد ()ConfigureWebHostDefaults دومین متدی است که درون ()CreateHostBuilder فراخوانی می شود. در زیر همه گام ها و کارهایی که این متد انجام می دهد، فهرست شده است:

  • در آغاز همه متغیرهای محیطی با پیشوند _ASPNETCORE را بارگذاری می کنند. اگر به یاد داشته باشید، یکی از این متغیرها ASPNETCORE_ENVIRONMENT بود که محیط را نشان می داد و در فایل launchSettings.json نگهداری می شد.
  • Krestal را به عنوان وب سرور پیکربندی می کند.
  • سپس یک میان افزار به نام Host Filtering را فعال می کند.این میان افزار توسط یک بسته (Package) به نام Microsoft.AspNetCore.HostFiltering پیاده سازی شده است. این میان افزار برای فیلتر کردن درخواست هایی HTTP با هدر میزبان (Host Header) ناشناخته به کار می رود.

هدر میزبان و میان افزار Host Filtering چیست

هدر یا سرایند بسته های پروتکل HTTP دارای فیلدهای گوناگونی است که یکی از این فیلدها، Host نام دارد که نام دامنه یا نشانی IP و شماره درگاه (پورت) سرور بر روی آن گوش می دهد را مشخص می کند. در این فیلد شاید شماره درگاه نباشد و این برای آن است که از شماره پورت پیشفرض استفاده شده است.

در شکل زیر که درون مایه فایل appsettings.json را نشان می دهد و یک پارامتر به نام AllowedHosts دارد که دست کم باید دارای یک مقدار باشد. در اینجا نشان * را داده ایم، پس همه نشانی های IP مجاز هستند ولی می توانیم یک فهرست جدا شده با سمی کالن ; از نشانی های IP یا نام دامنه شناسانده شده در سرور را داشته باشیم. برای اگر می خواهیم  تنها روی نام localhost درخواست های HTTP ورودی به وب سرور دریافت شود، پس به جای * باید localhost را پیش روی AllowedHosts بنویسیم. localhost نامی است که به نشانی Loopback به شماره 127.0.0.1 اشاره دارد. بنابراین اگر چندین کارت شبکه و از این رو چندین نشانی IP داشته باشیم و می خواهیم از میان آنها تنها برخی درخواست های ورودی به برنامه وب را مجاز بدانند، پس این نشانی ها با نشان ; پیش روی AllowedHosts از یکدیگر جدا نوشته می شوند.