با یکی دیگر از مقالات وب سایت پرووید در رابطه با توسعه وب اپلیکیشن ها با استفاده از Blazor در خدمت شما هستیم. همان طور که احتمالاً میدانید فریمورک Blazor امروز توسط مایکروسافت به عنوان یک فریمورک Interactive برای ساختن Front-End اپلیکیشن های تحت وب با استفاده از سی شارپ مورد استفاده قرار می گیرد، در این مقاله قصد داریم نحوه قرار دادن اپلیکیشنهای Blazor در Container ها را به منظور Development و Deployment به شما آموزش بدهیم. ما در این مقاله از .NET Core CLI استفاده خواهیم کرد بنابراین دستوراتی که دریافت خواهید کرد میتوانند در پلتفرم های مختلف مورد استفاده قرار بگیرد. در ابتدا توصیه میکنیم در صورت تمایل به به یادگیری فریمورک Blazor حتماً از آموزش شروع به کار با بلیزیر Blazor در ASP.NET Core و آموزش بلیزر Blazor پیشرفته برای اپلیکیشن های تجاری و آموزش Authentication و Authorization در بلیزر Blazor استفاده کنید.
در ابتدا به بررسی مدلهای میزبانی و یا اصطلاحاً Hosting Model ها در فریمورک Blazor خواهیم پرداخت.
بررسی Hosting Model ها در فریمورک Blazor
به طور کلی در فریمورک Blazor دو مدل میزبانی و یا Hosting Model برای اپلیکیشن تعریف میشوند. نیازمندیهای هر دوی این Hosting Model ها با یکدیگر متفاوت است، بنابراین در ابتدا در رابطه با این دو Hosting Model صحبت خواهیم کرد.
- مدل میزبانی Blazor WebAssembly: مدل میزبانی و یا Hosting Modelی که تحت عنوان Blazor WebAssembly شناخته می شود یک web framework می باشد که بر روی client-side و درون مرورگر کاربر با استفاده از وب اسمبلی اجرا می گردد.
- مدل میزبانی Blazor Server: این مدل میزبانی یک web framework می باشد که بر روی server-side اجرا می شود و سپس با استفاده از یک اتصال از نوع SignalR با مرورگر ارتباط برقرار می کند. در صورت تمایل به یادگیری SignalR در یک پروژه واقعی می توانید از لینک وزش ویدیویی سیگنال استفاده کنید. ضمنا سعی میکنیم در ادامه مقاله دیگری در رابطه با Hosting Modelهای Blazor به طور مفصل بر روی وبسایت منتشر کنیم.
بررسی مفصل WebAssembly Hosting Model
در این قسمت قصد داریم به طور دقیق در رابطه با مدل میزبانی WebAssembly در فریمورک Blazor صحبت کنیم، هدف این مدل میزبانی در واقع Host کردن و یا میزبانی برنامه به صورت کامل به درون مرورگر کاربر می باشد. مصنوعات یک اپلیکیشن Blazor با این مدل میزبانی در واقع محتویات html و جاوا اسکریپت و البته یک نسخه از .NET Runtime به همراه فایل های باینری می باشند بنابراین شما می توانید تمامی این مصنوعات را در قالب یک وب سایت استاتیک در مرورگر کاربر میزبانی کنید. در این نوع از مدل میزبانی هیچ Server Runtime و یا مفسر خاصی مورد نیاز نیست، البته در زمان انتشار این آموزش بر روی وبسایت پرویید مدل میزبانی Blazor WebAssembly هنوز در حالت پیش نمایش و یا Preview قرار دارد و به همین دلیل نیاز است که Template ایجاد کردن یک Blazor WebAssembly را به صورت دستی نصب کنید. البته ممکن است در زمانی که شما این مقاله را میخوانید این روال متفاوت باشد به هر حال اگر این مدل میزبانی از اپلیکیشنهای Blazor هنوز هم در حالت پیش نمایش و یا Preview قرار دارند میتوانید با استفاده از دستور زیر نسخه پیش نمایش را به دست بیاورید:
dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.1.0-preview4.19579.2
حال که این Template را نصب کردید به سادگی می توانید یک اپلیکیشن وب اسمبلی جدید را با استفاده از دستور .NET CLI زیر ایجاد کنید:
dotnet new blazorwasm -o wasmtest
این دستور باعث میشود که یک اپلیکیشن از نوع Blazor WebAssembly با نام “wasmtest” ایجاد شود. البته می توانید نام پروژه را به هر نام دیگری تغییر بدهید زمانی که پروژه را build و سپس تست کردید می توانید آن را به راحتی Publish کنید برای Publish کردن پروژه از دستور زیر استفاده می کنید:
dotnet publish -c Release
و پس از انجام این کار پنجره زیر را خواهید دید:
در این قسمت ما می توانیم مسیر مصنوعات و یا اصطلاحاً Artifact هایی که می خواهیم به عنوان یک اپلیکیشن .NET Core آنها را اجرا کنیم مشخص کنیم، این کار با استفاده از دستور dotnet run انجام میشود. قسمت زیر را مشاهده کنید:
/home/jeremy/Projects/wasmtest/bin/Debug/netstandard2.1/publish/
حال در رابطه با یکی از قابلیت های جذاب Blazor WebAssembly صحبت خواهیم کرد و آن هم استفاده کردن از فایل های استاتیک به عنوان مصنوعات پروژه می باشد علاوه بر این ما یک Output Folder برای Blazor داریم، این فولدر جایی است که همین فایل های استاتیک در آن منتشر میشوند. در مورد پروژه ما چون نام آن “wasmtest” می باشد، فولدر در مسیر زیر قرار دارد:
bin/Release/netstandard2.1/publish/wasmtest/dist
این موضوع ممکن است بر روی دستگاه و یا کامپیوتر شما متفاوت باشند دقت کنید که فولدر dist فقط شامل فایل های استاتیک میباشد این موضوع در تصویر زیر نیز نشان داده شده است:
حال می توانید این فایل را از درون هر Web Host استاتیکی اجرا کنید من یک فولدر جدید را برای Container ایجاد می کنم و البته در کنار آن نیز یک فولدر به نام artifacts قرار میدهم و تمامی محتویات فولدر dist را به درون فولدر artifacts کپی میکننم کد زیر این موضوع نشان میدهد:
mkdir -p ~/Projects/wasmcontainer/artifacts
cp -r ~/Projects/wasmtest/bin/Release/netstandard2.1/publish/wasmtest/dist/* ~/Projects/wasmcontainer/artifacts/
حال در فولدر wasmcontainer میبایستی یک فایل داکتر جدید ایجاد کنیم این موضوع در کد زیر نشان داده شده است:
FROM nginx COPY artifacts /usr/share/nginx/html
این فایل nginx image را دریافت کرده و سپس فایل ها را از درون فولدر artifacts در ماشین شما به فولدر /usr/share/nginx/html که فولدر پیش فرض nginx می باشد کپی می کند، این فولدر فایل سیستم Container شما قرار دارد. درواقع این کار هر زمان که می خواهید image مورد نظر را Build کنیم و یا تغییراتی بر روی artifact ها لحاظ کردهایم، اتفاق خواهد افتاد و در این رابطه نیاز است که image مورد نظر دوباره Build شود. تمام کاری که نیاز به انجام دادن آن داشتیم که بتوانیم فایل های استاتیک پروژه Blazor WebAssembly را اجرا کنیم همین بود. حال می توانید با دستور زیر یک image را ایجاد نمایید
docker build -t jeremy/wasmtest:latest .
و پس از انجام این کار با استفاده از دستور زیر آن را اجرا کنیم :
docker run --name wasm1 -p 80:80 -d jeremy/wasmtest:latest
این موضوع باعث میشود که Container به عنوان یک Daemon اجرا بگردد و تا زمانی که آن را متوقف نکرده اید به اجرا شدن ادامه خواهد داد. پس تا به اینجای کار ما یک nginx server داریم که اپلیکیشن ما را بر روی پورت ۸۰ اجرا می کند. می توانید با مرورگر تان به این صفحه رفته و خروجی زیر را مشاهده کنید:
حال در Production Environment باید بدانید که نیاز است پیکربندی های بیشتری را برای NGINX انجام بدهید، با این وجود این مراحل اپلیکیشن Blazor WebAssembly ما را در یک Container برای انجام Development میزبانی خواهد کرد.
بررسی Blazor Server Hosting Model
در ادامه می خواهیم در رابطه با مدل میزبانی سرور صحبت کنیم. برای استفاده کردن از این مدل میزبانی میبایست .NET Core runtime 3.0 و یا ورژن های بالاتر را نصب کنید. یک اپلیکیشن که با این مدل میزبانی ایجاد شده است با یک Template به نام blazorserver ساخته شده است. در این مثال من نام پروژه را servertest گذاشته ام. این موضوع در کد زیر نشان داده شده است:
dotnet new blazorserver -o servertest
پس از این که کار شما در تغییر برنامه کامل شد و آماده Deploy کردن آن هستید دستور زیر را اجرا کنید:
dotnet publish -c Release
و خروجی شبیه به تصویر زیر خواهد بود:
حال مصنوعات و یا artifact ها در فولدر زیر قرار داده خواهد شد:
/app/bin/Release/netcoreapp3.1/publish/
به علاوه ما یک فولدر دیگر شبیه به کاری که در قسمت قبلی انجام دادیم، ایجاد خواهیم کرد این موضوع در کد زیر نشان داده شده است:
mkdir -p ~/Projects/servercontainer/artifacts
cp -r bin/Release/netcoreapp3.1/publish/* ~/Projects/servercontainer/artifacts/
و لیست مربوط به مصنوعات و artifact ها شبیه به تصویر زیر خواهد بود:
حال یک فایل داکر دیگر در فولدر servercontainer را ایجاد خواهیم کرد که شبیه به قسمت زیر خواهد بود:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY artifacts/ app/
ENTRYPOINT ["dotnet", "app/servertest.dll"]
این فایل فقط دارای کد یک خط بیشتر نسبت به فایل قبلی می باشد، این خط مربوط به لحاظ کردن ایمیج مربوط به aspnet runtime می باشد. علاوه بر این تمامی artifact ها کپی شده و پس از آن یک نقطه ورود و یا Entry Point برای اپلیکیشن لحاظ می گردد. در این مثال این نقطه ورود servertest.dll است چرا که نام پروژه ما servertest می باشد. حال میتوانیم image مورد نظر را build کرده و این کار را با دستور زیر انجام دهیم:
docker build -t jeremy/servertest:latest .
این دستور شبیه به قسمت زیر خواهد بود:
که میتوانیم با استفاده از دستور زیر اقدام به اجرا کردن کنیم:
docker run --name server1 -p 80:80 -d jeremy/servertest:latest
باری دیگر این image به عنوان یک daemon اجرا خواهد شد و تا زمانی که آن را متوقف نکرده ایم به اجرا شدن ادامه خواهد داد. در ادامه می توانید اپلیکیشن Blazor Server خود را بر روی پورت ۸۰ شبیه به تصویر زیر مشاهده کنید:
جمع بندی
همانطور که در این مقاله از وب سایت پرووید مشاهده کردید، فرآیند Build کردن تعدادی Container برای Deploy کردن اپلیکیشن های Blazor کاری بسیار ساده است، فقط باید دقت کنید که Hosting Modelهای مختلف Blazor کمی با یکدیگر متفاوت هستند و می بایست image های منحصر به فرد هر کدام را به صورت جداگانه ایجاد کنید. image های که در این مقاله ایجاد کردیم برای فرآیند Deployment و البته Testing مناسب هستند اما اگر میخواهید این ها را در Production Environment قرار بدهید باید به موارد زیر دقت کنید:
- از SSL به جای استفاده کردن از پورت ۸۰ استفاده کنید.
- سعی کنید NGINX را برای Blazor WASM پیکربندی کنید تا بتوانید حداقل بهینه سازیهای مربوط به سیستم کشف کردن را به دست بیاورید.
- حتماً NGINX و یا یک Reverse Proxy دیگر را برای اپلیکیشن های Blazor Server سرور پیکربندی کنید.
در پایان امیدوارم که این مقاله از وبسایت پرووید در مورد توجه تمامی عزیزان قرار گرفته باشد. یک بار دیگر توصیه میکنیم که در صورت تمایل به یادگیری Blazor حتماً از آموزش شروع به کار با بلیزیر Blazor در ASP.NET Core و آموزش بلیزر Blazor پیشرفته برای اپلیکیشن های تجاری و آموزش Authentication و Authorization در بلیزر Blazor استفاده بفرمایید.