آموزش جامع ASP.NET Core MVC – جلسه پنجم– متد Main و مدل میزبانی InProcess و OutofProcess

ASP.NET Core MVC Tutorial - Session 5

در این جلسه از آموزش جامع ASP.NET Core MVC به نحوه آغاز یک برنامه وب‌اپلیکیشن و متد Main خواهیم پرداخت، همچنین مدل میزبانی InProcess و OutofProcess برای شما عزیزان شرح داده خواهد شد. ضمنا این دو مدل میزبانی را به صورت عملی برای شما پیاده‌سازی خواهیم کرد.
اگر به ساختار اپلیکیشنی که در جلسات قبل ایجاد نمودیم (ASP.NET Core Empty) و ساختار آنرا در جلسه سوم همین دوره آموزشی شرح دادیم دقت نمایید، متوجه میشوید که این ساختار شباهت بسیار زیادی به Console Application در نسخه‌های قدیمی تر ASP.NET دارد. در واقع وب‌اپلیکیشن در ASP.NET Core و ASP.NET 5 یک Console Application میباشد که در زمان اجرا تبدیل به وب‌اپلیکیشن میشود. به قطعه کد زیر توجه بفرمایید.

public class Program
{
   public static void Main(string[] args)
   {
       CreateHostBuilder(args).Build().Run();
   }

   public static IHostBuilder CreateHostBuilder(string[] args) =>
     Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
      {
         webBuilder.UseStartup<Startup>();
      });
   }
}

متد Main

شروع هر وب‌اپلیکیشن ASP.NET Core با فراخوانی متد Main در کلاس Program آغاز میگردد. در زمان اجرای دستورات متد Main، متد CreateHostBuilder اجرا میگردد که کد آن بلافاصله بعد از متد Main قرار دارد. این متد حاوی خروجی ابسترکت IHostBuilder میباشد که در زمان اجرای آن، محیط میزبانی وب‌اپلیکیشن ما بر اساس تعاریف پیش فرض، تنظیم و ایجاد میگردد. این فرایند با اجرای متد ConfigureWebHostDefaults و CreateDefaultBuilder از کلاس Host اتفاق می‌افتد که همگی از زیرمجموعه های فضای نام Microsoft.Extensions میباشند.
همچنین تنظیمات مربوط به سرویس‌های مورد نظر وب‌اپلیکشن، خط لوله (PipeLine) و درخواست های HTTP اپلیکیشن ما در زمان ایجاد فضای میزبانی توسط کلاس Startup تعریف میگردد. webBuilder.UseStartup<Startup>().

کلاس Startup

این کلاس حاوی دو متد بسیار مهم ConfigureServices و Configure برای وب‌اپلیکیشن می‌باشد. متد ConfigureServices همانگونه که از نام آن مشخص است برای تعریف سرویس‌های مورد نیاز وب‌اپلیکشن مورد استفاده قرار میگیرد. همچنین وظیفه متد Configure برای کنترل و مدیریت درخواست‌ها و پاسخ‌ها به وب‌اپلیکشن میباشد. اگر در حال حاضر این تعاریف برای شما واضح نمیباشند نگران نباشید جرا که در طول دوره آموزشی با این دو متد بیشتر کار خواهیم کرد و کاربرد آنها را به صورت عملی مشاهده خواهید کرد. قطعه کد زیر مربوط به متدهای شرح داده شده در کلاس Startup میباشد.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }

میزبانی InProcess و OutofProcess

به طور کلی هر وب‌اپلیکیشن ASP.NET Core به دو حالت InProcess و OutofProcess میتواند میزبانی گردد. InProcess به حالتی از میزبانی گفته می‌شود که وب‌اپلیکشن توسط وب‌سرور IIS میزبانی شده باشد. در این حالت کاربران درخواست‌های خود را به وب‌سرور IIS ارسال می‌کنند و این وب‌سرور اطلاعات مورد درخواست را از اپلیکشن دریافت نموده و به سمت کاربر ارسال می‌کند. این نوع میزبانی دارای کارآیی بالاتری به نسبت نوع میزبانی OutofProcess می‌باشد و نقطه ضعف آن عدم پشتیبانی از امکان Cross-Platform است. InProcess فقط بروی سرور‌های با سیستم عامل ویندوز قابل پیاده سازی میباشد. تصویر مقابل نشان دهنده نوع میزبانی InProcess می‌باشد.

نمای میزبانی InProcess

حالت میزبانی OutofProcess که حالت پیش‌فرض وب‌اپلیکیشن‌های ASP.NET Core میباشد، دارای قابلیت Cross-Platform میباشد. در حالت OutofProcess اپلیکیشن توسط وب‌سرور Kestrel که یه وب‌سرور الحاق شده به ASP.NET Core میباشد میزبانی میگردد. این وب‌سرور Cross-Platform بوده و میتواند به صورت مستقل، میزبانی وب‌اپلیکشن‌های ASP.NET Core را انجام دهد. همچنین در این حالت میزبانی، Kestrel می‌تواند به عنوان وب‌سرور داخلی عمل کند و یک وب‌سرور دیگر مانند IIS، Apache و Nginx به عنوان پروکسی سرور (Reverse Proxy Server) عمل کند. در این حالت کاربر به صورت مستقیم با اپلیکیشن ما در ارتباط نخواهد بود و ارسال درخواست و پاسخ توسط وب‌سرور واسط انجام میشود. این روش دارای کارآیی کمتری بوده ولی امکان استفاده از لایه های امنیتی چندگانه و Load Balancing را در اختیار ما قرار میدهد. تصاویر زیر نمایی از دو حالت میزبانی OutofProcess را به نمایش می‌گذارد.

میزبانی OutofProcess با وب‌سرور Kestrel
میزبانی OutofProcess با میزبانی Kestrel و Reverse Proxy Server

تنظیمات مدل میزبانی InProcess و OutofProcess در فایل پروژه

جهت تنظیم نوع میزبانی، می‌بایست فایل پروژه وب‌اپلیکیشن را ویرایش نماییم. نحوه ویرایش این فایل در جلسه چهارم به صورت کامل توضیح داده شد. پس این قطعه کد <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> را برای میزبانی InProcess و این قطعه کد <AspNetCoreHostingModel>OutofProcess</AspNetCoreHostingModel> را برای حالت میزبانی OutofProcess به فایل پروژه اضافه نمایید.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
	  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>

</Project>

ضمنا جهت مشاهده و تنظیم پروفایل اجرای وب‌اپلیکشن در زمان توسعه، میتوانید به قسمت Properties پروژه خود مراجعه نمایید و در قسمت Debug اقدام به انجام تنظیمات مورد نظر نمایید. اطلاعات این پروفایل‌ها در فایل launchSettings.json در پوشه properties نیز قابل مشاهده و ویرایش میباشند. ما در ویدئو آموزشی این جلسه نحوه اضافه کردن وب‌سرور IIS به لیست launcher ها اپلیکیشن و همچنین اجرا وب‌اپلیکیشن توسط خط فرمان ویژوال استودیو Visual Studio Command را نشان داده‌ایم.
ضمنا در ویدئو این جلسه، مباحث میزبانی InProcess و OutofProcess به صورت عملی پیاده سازی شده است. همچنین شما هم برای مشاهده ProcessName وب‌سرور خود مبایست مانند قطعه کد زیر در متد Configure در کلاس Startup عمل نمایید.

       public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.
                        WriteAsync(System.Diagnostics.Process.
                           GetCurrentProcess().ProcessName);
                });
            });
        }


در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام و یوتیوب دنبال کنید و از این طریق با ما در ارتباط باشد.

تماشای ویدیو در یوتیوب ما

دانلود اسلایدهای آموزشی این جلسه از اینجا

برچسب ها

5 1 رای
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
0
افکار شما را دوست داریم، لطفا نظر دهید.x