زنگ خطر برای مایکروسافت با آمدن Node.js به صدا در آمد. هر تکنولوژی ایراداتی دارد و ASP هم از این جدا نبود. گوگل با بازاریابی هوشمندانه موفق شد Node.js را بین برنامه نویسان وب به خصوص آنهایی که به سورس باز علاقه داشتند محبوب کند . خیلی از برنامه نویسان قدیمی ASP شروع به مهاجرت به Node کردند.
نود سبک بود و روی هر سیستم عاملی کار می کرد . فقط لازم بود جاوا اسکریپت بلد باشید تا کدهای سرور و کلاینت را بنویسید. گوگل با ترویج برنامه نویسی MEAN یا چهارگانه ی (MongoDb- ExpressJS- Angular- Nodejs ) سعی کرد پایه گذار روش جدیدی در طراحی سایت شود و PHP و ASP را پشت سر بگذارد.
اما برای خیلی ها که از ASP به Node رفتند تجربه ی موفقی حاصل نشد. در ASP بار اصلی به دوش Visual Studio به عنوان کاملترین IDE است. اما برای Node حتی Notepad هم کفایت می کند. چیزی که هم خوب است و هم بد. در Node ابزار خوبی برای کد نویسی روزانه وجود ندارد. کارهایی که در ASP به راحتی انجام میدهید در Node تبدیل به کابوس می شود. جاوا اسکریپت به عنوان زبانی که Strongly Typed نیست ، خطایابی را بسیار مشکلتر می کند. چیزی که در پروژه های بزرگ سمت سرور به وضوح خودش را نشان میدهد. برای پروژه های بزرگ باید TypeScript استفاده کنید که باز هم از محصولات مایکروسافت است.
برای برنامه نویسان تازه کار و آنهایی که با PHP سالها کار می کردند Nodejs بسیار جالب بود و ناگهان همه به سوی آن رو آوردند. با وجود اینکه ASP امتحان خود را پس داده بود و همه می دانستند در بزرگترین پروژه ها می توان روی ASP حساب کرد اما Node نو رسیده ای بود که همه دوستش داشتند.
اینجا بود که مایکروسافت تصمیم به پیاده سازی MVC 6 گرفت. قرار بود همه ی خوبی های Node را کنار امکانات ASP قرار دهند و نو رسیده ی تازه ای درست کنند. اولین قدم سورس باز شدن بود. بعد نوبت باز نویسی موتور پایه ASP رسید. اگر قرار بود تکنولوژی جدید مانند نود روی همه ی سیستم عامل ها کار کند باید دات نت جاری را کنار می گذاشتند.
بعد از دو سال کار اولین نسخه ی ASP جدید با نام Core منتشر شد. نام جدید هم به این معنی بود که تغییرات آنقدر زیاد هست که نمی توان آن را نسخه ی 6 نامید . در عین تازگی محصول جدید شباهت های زیادی با نسخه های قبلی داشت و ساختار در خیلی از جاها حفظ شده بود. از این رو آن را ASP Core نامیدند.
نود سبک بود و روی هر سیستم عاملی کار می کرد . فقط لازم بود جاوا اسکریپت بلد باشید تا کدهای سرور و کلاینت را بنویسید. گوگل با ترویج برنامه نویسی MEAN یا چهارگانه ی (MongoDb- ExpressJS- Angular- Nodejs ) سعی کرد پایه گذار روش جدیدی در طراحی سایت شود و PHP و ASP را پشت سر بگذارد.
اما برای خیلی ها که از ASP به Node رفتند تجربه ی موفقی حاصل نشد. در ASP بار اصلی به دوش Visual Studio به عنوان کاملترین IDE است. اما برای Node حتی Notepad هم کفایت می کند. چیزی که هم خوب است و هم بد. در Node ابزار خوبی برای کد نویسی روزانه وجود ندارد. کارهایی که در ASP به راحتی انجام میدهید در Node تبدیل به کابوس می شود. جاوا اسکریپت به عنوان زبانی که Strongly Typed نیست ، خطایابی را بسیار مشکلتر می کند. چیزی که در پروژه های بزرگ سمت سرور به وضوح خودش را نشان میدهد. برای پروژه های بزرگ باید TypeScript استفاده کنید که باز هم از محصولات مایکروسافت است.
برای برنامه نویسان تازه کار و آنهایی که با PHP سالها کار می کردند Nodejs بسیار جالب بود و ناگهان همه به سوی آن رو آوردند. با وجود اینکه ASP امتحان خود را پس داده بود و همه می دانستند در بزرگترین پروژه ها می توان روی ASP حساب کرد اما Node نو رسیده ای بود که همه دوستش داشتند.
اینجا بود که مایکروسافت تصمیم به پیاده سازی MVC 6 گرفت. قرار بود همه ی خوبی های Node را کنار امکانات ASP قرار دهند و نو رسیده ی تازه ای درست کنند. اولین قدم سورس باز شدن بود. بعد نوبت باز نویسی موتور پایه ASP رسید. اگر قرار بود تکنولوژی جدید مانند نود روی همه ی سیستم عامل ها کار کند باید دات نت جاری را کنار می گذاشتند.
بعد از دو سال کار اولین نسخه ی ASP جدید با نام Core منتشر شد. نام جدید هم به این معنی بود که تغییرات آنقدر زیاد هست که نمی توان آن را نسخه ی 6 نامید . در عین تازگی محصول جدید شباهت های زیادی با نسخه های قبلی داشت و ساختار در خیلی از جاها حفظ شده بود. از این رو آن را ASP Core نامیدند.
آشنایی با ViewData ، ViewBag و TempData
در محیط ASP Core هم مانند ASP MVC سه روش برای انتقال اطلاعات از کنترلر به ویو وجود دارد.
روش ViewData
این روش از قدیمی ترین تکنیک های گردش اطلاعات از کنترلر به ویو است. در این روش اطلاعات به صورت Weakly-Typed است و موقع تایپ کردن کدها از طرف VS راهنمایی دریافت نمی کنید (Intellisense). اطلاعات به صورت جفتهای Key-Value است و با فراخوانی کلید می توانید مقدار آن را مشاهده کنید. همه ی داده های Model هم درون ViewData قرار می گیرد. در حقیقا مدل در View ها از درون ViewData خوانده میشود. با این تفاوت که مدل Strongly-Typed است و شهروند درجه اول در محیط ویو است.
روش ViewBag
داده های درون ViewBag آینه تمام نما یا کپی کامل اطلاعات درون ViewData است. با این تفاوت که این کپی روی یک شی dynamic انجام گرفته است. شی dynamic در #C می تواند بعد از کامپایل تغییر کند و خصوصیات جدید دریافت کند. به همین دلیل نیاز نیست که خصوصیات مدل یا کلیدها را قبلا در کد تعریف کنید و می توانید آن را مستقیما بخوانید.
روش TempData
اطلاعات در این روش مانند دو روش قبل به صورت Key-Value دخیره میشود و می توانید هر نوع داده ای را ذخیره کنید اما حجم داده دارای محدودیت است و بهتر است از 500 بایت فراتر نرود. اطلاعات TempData در ASP Core رمز گذاری شده و درون Cookie ذخیره میشود. به این معنی که با تغییر مرورگر توسط کاربراز بین میرود. نکته ی مهم در مورد TempData این است که بلافاصله بعد از آنکه اطلاعات آن خوانده شد پاک میشود. از این روش برای ارسال اطلاعاتی که نیاز به نگه داری بلند مدت و یا هنگام Redirect استفاده میشود.
در نسخه Razor Pages امکان استفاده از ViewBag وجود ندارد و این امکان قرار نیست به آن اضافه شود. به طور کلی توصیه میشود همیشه از ViewData استفاده کنید چون ViewBag متغیر دینامیک است و پردازش آن زمان بیشتری میگیرد.
در محیط ASP Core هم مانند ASP MVC سه روش برای انتقال اطلاعات از کنترلر به ویو وجود دارد.
روش ViewData
این روش از قدیمی ترین تکنیک های گردش اطلاعات از کنترلر به ویو است. در این روش اطلاعات به صورت Weakly-Typed است و موقع تایپ کردن کدها از طرف VS راهنمایی دریافت نمی کنید (Intellisense). اطلاعات به صورت جفتهای Key-Value است و با فراخوانی کلید می توانید مقدار آن را مشاهده کنید. همه ی داده های Model هم درون ViewData قرار می گیرد. در حقیقا مدل در View ها از درون ViewData خوانده میشود. با این تفاوت که مدل Strongly-Typed است و شهروند درجه اول در محیط ویو است.
روش ViewBag
داده های درون ViewBag آینه تمام نما یا کپی کامل اطلاعات درون ViewData است. با این تفاوت که این کپی روی یک شی dynamic انجام گرفته است. شی dynamic در #C می تواند بعد از کامپایل تغییر کند و خصوصیات جدید دریافت کند. به همین دلیل نیاز نیست که خصوصیات مدل یا کلیدها را قبلا در کد تعریف کنید و می توانید آن را مستقیما بخوانید.
روش TempData
اطلاعات در این روش مانند دو روش قبل به صورت Key-Value دخیره میشود و می توانید هر نوع داده ای را ذخیره کنید اما حجم داده دارای محدودیت است و بهتر است از 500 بایت فراتر نرود. اطلاعات TempData در ASP Core رمز گذاری شده و درون Cookie ذخیره میشود. به این معنی که با تغییر مرورگر توسط کاربراز بین میرود. نکته ی مهم در مورد TempData این است که بلافاصله بعد از آنکه اطلاعات آن خوانده شد پاک میشود. از این روش برای ارسال اطلاعاتی که نیاز به نگه داری بلند مدت و یا هنگام Redirect استفاده میشود.
در نسخه Razor Pages امکان استفاده از ViewBag وجود ندارد و این امکان قرار نیست به آن اضافه شود. به طور کلی توصیه میشود همیشه از ViewData استفاده کنید چون ViewBag متغیر دینامیک است و پردازش آن زمان بیشتری میگیرد.
کتاب مختصر و مفید درباره ASP Core
این کتاب به زبان انگلیسی و در 124 صفحه تهیه شده و به صورت مختصر مفید شما را با مبانی برنامه نویسی در محیط ASP Core آشنا می کند. این کتاب به صورت رایگان است و شامل قوانین کپی رایت نمی شود. می توانید آن را از وبلاگ شخصی نویسنده دانلود کنید.
https://www.recaffeinate.co/book/
این کتاب به زبان انگلیسی و در 124 صفحه تهیه شده و به صورت مختصر مفید شما را با مبانی برنامه نویسی در محیط ASP Core آشنا می کند. این کتاب به صورت رایگان است و شامل قوانین کپی رایت نمی شود. می توانید آن را از وبلاگ شخصی نویسنده دانلود کنید.
https://www.recaffeinate.co/book/
recaffeinate.co
The Little ASP.NET Core Book
A friendly introduction to web programming and ASP.NET Core
در دنیای وب HTTP یک محیط State-less است و محلی برای ذخیره سازی موقعیت جاری ندارد. اطلاعات HTTP بین دو درخواست حفظ نمی شود. از این رو برای انتقال اطلاعات به Request های بعدی نیاز به ابزار کمکی داریم .
در ASP Core مانند نسخه های قبل امکان استفاده از Session وجود دارد. به طور پیش فرض اطلاعات Session در کوکی ذخیره میشود. مدت زمان پیش فرض برای نگه داری اطلاعات 20 دقیقه است که می توانید تغییر دهید. همچنین از آنجا اطلاعات در کوکی مرورگر نگه داری میشود اگر کاربر مرورگر خود را هنگام کار عوض کند اطلاعات Session از بین میرود.
روش دیگر ذخیره ی Session استفاده از حافظه ی سرور است. در این روش اطلاعات به صورت محلی در سرور ذخیره میشود. این روش بار بیشتری به سرور وارد می کند و آپدیت کردن و بروز رسانی سرور را مشکلتر میکند.
نباید اطلاعات محرمانه را در Session ذخیره کرد. همچنین اطلاعات آن مختص به یک کاربر نیست و ممکن است کاربر دیگر با استفاده از همان مرورگر بتواند از Session قبلی استفاده کند.
بر خلاف گذشته اطلاعات Session قفل نمی شود و هر درخواست جدید می تواند آن را تغییر دهد. در واقع اگر چند درخواست بخواهند اطلاعات Session را تغییر دهند آخرین درخواست برنده میشود.
استفاده از Session به طور کلی توصیه نمی شود و بهتر است تا می توانید از آن صرف نظر کنید. اما در ASP Core ابزار خوبی برای مدیریت Session وجود دارد.
در ASP Core مانند نسخه های قبل امکان استفاده از Session وجود دارد. به طور پیش فرض اطلاعات Session در کوکی ذخیره میشود. مدت زمان پیش فرض برای نگه داری اطلاعات 20 دقیقه است که می توانید تغییر دهید. همچنین از آنجا اطلاعات در کوکی مرورگر نگه داری میشود اگر کاربر مرورگر خود را هنگام کار عوض کند اطلاعات Session از بین میرود.
روش دیگر ذخیره ی Session استفاده از حافظه ی سرور است. در این روش اطلاعات به صورت محلی در سرور ذخیره میشود. این روش بار بیشتری به سرور وارد می کند و آپدیت کردن و بروز رسانی سرور را مشکلتر میکند.
نباید اطلاعات محرمانه را در Session ذخیره کرد. همچنین اطلاعات آن مختص به یک کاربر نیست و ممکن است کاربر دیگر با استفاده از همان مرورگر بتواند از Session قبلی استفاده کند.
بر خلاف گذشته اطلاعات Session قفل نمی شود و هر درخواست جدید می تواند آن را تغییر دهد. در واقع اگر چند درخواست بخواهند اطلاعات Session را تغییر دهند آخرین درخواست برنده میشود.
استفاده از Session به طور کلی توصیه نمی شود و بهتر است تا می توانید از آن صرف نظر کنید. اما در ASP Core ابزار خوبی برای مدیریت Session وجود دارد.
فریم ورک ASP Core چقدر سریع است ؟
در مقایسه با نسخه ی قدیمی پیشرفت ASP Core بسیار چشمگیر است و فرسنگها از نزدیکترین رقیبش یعنی Nodejs فاصله دارد. البته مبنای بررسی ما فریم ورکهای وبی است که قابلیت پیاده سازی یک سایت کامل را دارند و فقط برای شبکه های مخابراتی یا میکروسرویسهای اختصاصی طراحی نشده اند.
در چند سال اخیر Nodejs سریعترین فریم ورک تحت وب به شمار میرفت و آمار آن اصلا با ASP MVC 5 قابل مقایسه نبود. سرعت همیشه یکی از مهمترین عوامل انتخاب تکنولوژی است و در مورد Raygun نشان میدهد فریم ورک چقدر می تواند در این زمینه اهمیت داشته باشد.
برای مقایسه سرعت ابتدا باید یک مبنای مشترک داشته باشیم. در این زمینه سایت Techempower با ارائه ی یک Benchmark معتبر توانسته اعتماد برنامه نویسان و شرکتهای نرم افزاری را جلب کند.
آمارهای Techempower همه ی شرایط اجرای سایت ها را پوشش نمیدهد و هنوز راه درازی دارد تا به عنوان مرجع کامل مورد استفاده قرار بگیرد. اما دید مناسبی از عملکرد انواع فریم ورکها و سرورها در شرایط مختلف ارائه می دهد.
اولین مبنای سرعت تست Plaintext است. در این تست سرور فقط عبارت Hello World را به کلاینت برمی گرداند. این ساده ترین شکل پاسخ است و طبیعی است که اگر فریم ورکی در این زمینه کند عمل کند در سایر زمینه ها هم کند است. وقتی در سال 2016 اولین آمار ASP Core در این تست نمایش داده شده همه را هیجان زده کرد. تعداد درخواست های پاسخ داده شده از 50 هزار در ثانیه (در ASP MVC قدیم) به 1.15 میلیون (در ASP Core ) رسید. یعنی عملکرد ASP Core در مقایسه با ASP 4.6 حدود 23 برابر بهتر شده بود.
آخرین آمار رسمی Techempower در روز ولنتاین منتشر شد و برای ASP Core 2 رکورد 2.216 میلیون را ثبت کرده است.
در مقایسه با نسخه ی قدیمی پیشرفت ASP Core بسیار چشمگیر است و فرسنگها از نزدیکترین رقیبش یعنی Nodejs فاصله دارد. البته مبنای بررسی ما فریم ورکهای وبی است که قابلیت پیاده سازی یک سایت کامل را دارند و فقط برای شبکه های مخابراتی یا میکروسرویسهای اختصاصی طراحی نشده اند.
در چند سال اخیر Nodejs سریعترین فریم ورک تحت وب به شمار میرفت و آمار آن اصلا با ASP MVC 5 قابل مقایسه نبود. سرعت همیشه یکی از مهمترین عوامل انتخاب تکنولوژی است و در مورد Raygun نشان میدهد فریم ورک چقدر می تواند در این زمینه اهمیت داشته باشد.
برای مقایسه سرعت ابتدا باید یک مبنای مشترک داشته باشیم. در این زمینه سایت Techempower با ارائه ی یک Benchmark معتبر توانسته اعتماد برنامه نویسان و شرکتهای نرم افزاری را جلب کند.
آمارهای Techempower همه ی شرایط اجرای سایت ها را پوشش نمیدهد و هنوز راه درازی دارد تا به عنوان مرجع کامل مورد استفاده قرار بگیرد. اما دید مناسبی از عملکرد انواع فریم ورکها و سرورها در شرایط مختلف ارائه می دهد.
اولین مبنای سرعت تست Plaintext است. در این تست سرور فقط عبارت Hello World را به کلاینت برمی گرداند. این ساده ترین شکل پاسخ است و طبیعی است که اگر فریم ورکی در این زمینه کند عمل کند در سایر زمینه ها هم کند است. وقتی در سال 2016 اولین آمار ASP Core در این تست نمایش داده شده همه را هیجان زده کرد. تعداد درخواست های پاسخ داده شده از 50 هزار در ثانیه (در ASP MVC قدیم) به 1.15 میلیون (در ASP Core ) رسید. یعنی عملکرد ASP Core در مقایسه با ASP 4.6 حدود 23 برابر بهتر شده بود.
آخرین آمار رسمی Techempower در روز ولنتاین منتشر شد و برای ASP Core 2 رکورد 2.216 میلیون را ثبت کرده است.
سورس یک پروژه میان افزار
پیاده سازی یک میان افزار همراه با Extention و بخش Options در ASP Core که یک فایل انتخابی را به کاربر بر میگرداند.
https://github.com/codehaks/Codehaks.Middlewares.SendFile
پیاده سازی یک میان افزار همراه با Extention و بخش Options در ASP Core که یک فایل انتخابی را به کاربر بر میگرداند.
https://github.com/codehaks/Codehaks.Middlewares.SendFile
GitHub
codehaks/Codehaks.Middlewares.SendFile
Codehaks.Middlewares.SendFile - A middleware for ASP.NET Core to send back a file in the response
پروژه دمو با Vue.js
در این پروژه لیست کامل کشورها رو با استفاده از ajax بارگذاری می کنیم و سپس با کمک Vue.js آنها را در یک جدول نمایش می دهیم.
قابلیت جستجوی نام کشورها و فیلتر کردن آنها بر اساس قاره هم اضافه شده است. همچنین شما می توانید همه ی ستونها را از بالا به پایین یا از پایین به بالا مرتب کنید.
برای جستجو و فیلتر سازی از lodash.js استفاده شده است .
https://github.com/codehaks/WorldVue
در این پروژه لیست کامل کشورها رو با استفاده از ajax بارگذاری می کنیم و سپس با کمک Vue.js آنها را در یک جدول نمایش می دهیم.
قابلیت جستجوی نام کشورها و فیلتر کردن آنها بر اساس قاره هم اضافه شده است. همچنین شما می توانید همه ی ستونها را از بالا به پایین یا از پایین به بالا مرتب کنید.
برای جستجو و فیلتر سازی از lodash.js استفاده شده است .
https://github.com/codehaks/WorldVue
GitHub
codehaks/WorldVue
Search, Filter and sort world countires! Contribute to codehaks/WorldVue development by creating an account on GitHub.
نگاهی دوباره به Razor Pages
تیم ASP Core تلاش زیادی می کند استفاده از Razor Pages را بجای MVC جا بندازد. الگوی MVC سالها از محبوبترین روشهای پیاده سازی سایت بوده است اما اشکالاتی هم دارد.
در الگوی MVC همیشه نیاز به کنترلر دارید. حتی وقتی می خواهید یک صفحه ی ساده "ارتباط با ما" نمایش دهید باید کنترلر و اکشن داشته باشید. همچنین مدل و ویو و کنترلر در فولدرهای مجزا نگه داری میشوند و مدیریت کردن پروژه در درازمدت سخت میشود. اگر بخواهید یک کنترلر را به همراه مدل و ویوهایش به یک پروژه ی دیگر منتقل کنید با دردسرهای زیادی روبرو هستید.
در Razor Pages دیگر کنترلر نداریم و اکشن ها می توانند درون فایل ویو یا در یک فایل همنام ویو (مانند کلاسهای Win Form) قرار گیرند. در الگوی MVC در واقع Controller اهمیت ندارد بلکه اکشن های درون کنترلر هستند که درخواستها را مدیریت می کنند. این دقیقا بخشی است که Razor Pages روی آن تاکید دارد.
وقتی از Razor Pages استفاده می کنید تمام قابلیتهای MVC را دارید. بخشی از MVC است و درون یک سرویس بارگذاری میشود. وقتی یک پروژه ی MVC در ASP Core ایجاد می کنید همزمان Razor Page هم به پروژه اضافه میشود. می توانید بخشی از سایت را MVC و بخش دیگر را با Razor Page طراحی کنید.
در Razor Page طراحی سایت بجای کنترلر روی صفحه تمرکز دارد. ابتدا صفحه ی HTML را ایجاد می کنید و سپس اکشن های آن را (اگر لازم داشت) می سازید. برای سایتهایی که صفحات زیادی دارند گزینه ی مناسبی است اما برای وب سرویس ها یا پروژه هایی که از AJAX زیاد استفاده می کنند کارایی ندارد.
مایکروسافت تاکید می کند که Razor Page فقط برای طراحی سایت های کوچک نیست و می توانید برای پیاده سازی هر سایتی از آن استفاده کنید. اما برنامه نویسان پر سابقه ی MVC هنوز با شک و تردید به این تکنولوژی نگاه می کنند.
تیم ASP Core تلاش زیادی می کند استفاده از Razor Pages را بجای MVC جا بندازد. الگوی MVC سالها از محبوبترین روشهای پیاده سازی سایت بوده است اما اشکالاتی هم دارد.
در الگوی MVC همیشه نیاز به کنترلر دارید. حتی وقتی می خواهید یک صفحه ی ساده "ارتباط با ما" نمایش دهید باید کنترلر و اکشن داشته باشید. همچنین مدل و ویو و کنترلر در فولدرهای مجزا نگه داری میشوند و مدیریت کردن پروژه در درازمدت سخت میشود. اگر بخواهید یک کنترلر را به همراه مدل و ویوهایش به یک پروژه ی دیگر منتقل کنید با دردسرهای زیادی روبرو هستید.
در Razor Pages دیگر کنترلر نداریم و اکشن ها می توانند درون فایل ویو یا در یک فایل همنام ویو (مانند کلاسهای Win Form) قرار گیرند. در الگوی MVC در واقع Controller اهمیت ندارد بلکه اکشن های درون کنترلر هستند که درخواستها را مدیریت می کنند. این دقیقا بخشی است که Razor Pages روی آن تاکید دارد.
وقتی از Razor Pages استفاده می کنید تمام قابلیتهای MVC را دارید. بخشی از MVC است و درون یک سرویس بارگذاری میشود. وقتی یک پروژه ی MVC در ASP Core ایجاد می کنید همزمان Razor Page هم به پروژه اضافه میشود. می توانید بخشی از سایت را MVC و بخش دیگر را با Razor Page طراحی کنید.
در Razor Page طراحی سایت بجای کنترلر روی صفحه تمرکز دارد. ابتدا صفحه ی HTML را ایجاد می کنید و سپس اکشن های آن را (اگر لازم داشت) می سازید. برای سایتهایی که صفحات زیادی دارند گزینه ی مناسبی است اما برای وب سرویس ها یا پروژه هایی که از AJAX زیاد استفاده می کنند کارایی ندارد.
مایکروسافت تاکید می کند که Razor Page فقط برای طراحی سایت های کوچک نیست و می توانید برای پیاده سازی هر سایتی از آن استفاده کنید. اما برنامه نویسان پر سابقه ی MVC هنوز با شک و تردید به این تکنولوژی نگاه می کنند.