اشتراکها
اشتراکها
بهبود عمکلرد Asp.net core
در حال حاضر من کتاب CLR Via Csharp ویرایش چهارم نوشته آقای جفری ریچر را مطالعه میکنم و نه قسمت از این مقالات، از بخش اول فصل اول آن به پایان رسیده که همگی آنها را تا 9 روز آینده منتشر خواهم کرد. البته سعی شده که مقالات ترجمه صرف نباشند و منابع دیگری هم در کنار آن استفاده شده است. بعضی موارد را هم لینک کردهام. تمام سعی خود را میکنم تا ادامه کتاب هم به مرور به طور مرتب ترجمه شود؛ تا شاید نسخهی تقریبا کاملی از این کتاب را به زبان فارسی در اختیار داشته باشیم.
بعد از اینکه برنامه را تحلیل کردید و نیازمندیهای یک برنامه را شناسایی
کردید، وقت آن است که زبان برنامه نویسی خود را انتخاب کنید. هر زبان ویژگیهای خاص و منحصر به فرد خود را دارد و این ممکن هست انتخاب شما را سخت کند.
برای مثال شما در زبانهای ++unmanaged C/C، کنترل بسیار زیادی روی امور
سیستمی از قبیل حافظه و تردها دارید و به هر روشی که میخواهید میتوانید آنها را پیکربندی کنید. در زبانهایی چون Visual basic قدیم و
مشابههای آن عموما اینگونه بود که طراحی یک اپلیکیشن از رابط کاربری گرفته
تا اتصال به دیتابیس و اشیاء COM در آن ساده باشد؛ ولی در زبانهای CLR چطور؟ در زبانهای CLR شما دیگر وقت خود را به موضوعاتی چون مدیریت حافظه، هماهنگ سازی تردها و مباحث امنیتی و صدور استثناء در سطوح پایینتر نمیدهید و فرقی هم نمیکند که از چه زبانی استفاده میکنید. بلکه CLR هست که این امور را انجام میدهد و این مورد بین تمامی زبانهای CLR مشترک است. برای مثال کاربری که قرار است در زمان اجرا استثناءها را صادر کند، در واقع مهم نیست که از چه زبانی برای آن استفاده میکند. بلکه آن CLR است که مدیریت آن را به عهده دارد و روال کار CLR برای همه زبانها یکی است. پس این سوال پیش میآید که وقتی مبنا و زیر پایهی همه زبانهای CLR یکی است، چرا تعدد زبان دیده میشود و مزیت هر کدام بر دیگری چیست؟ اولین مورد syntax آن است. هر کاربر رو به چه زبانی کشیده میشود و شاید تجربهی سابق در قدیم با یک برنامهی مشابه بوده است که همچنان همان رویه سابق را ادامه میدهد و یا اینکه نحوهی تحلیل و آنالیز کردن کدهای آن زبان است که کاربر را به سمت خود جذب کرده است. گاهی اوقات بعضی از زبانها با تمرکز در انجام بعضی از کارها چون امور مالی یا ریاضیات، موارد فنی و ... باعث جذب کاربران آن گروه کاری به سمت خود میشوند. البته بعدا در آینده متوجه میشویم که بسیاری از زبانها مثل سی شارپ و ویژوال بیسیک هر کدام قسمتی از امکانات CLR را پوشش میدهند نه تمام آن را.
زبانهای CLR چگونه کار میکنند؟
در اولین گام بعد از نوشتن برنامه، کامپایلر آن زبان دست به کار شده و برنامه را برای شما کامپایل میکند. ولی اگر تصور میکنید که برنامه را به کد ماشین تبدیل میکند و از آن یک فایل اجرایی میسازد، سخت در اشتباه هستید. کامپایلر هر زبان CLR، کدها را به یک زبان میانی Intermediate Language به اختصار IL تبدیل میکند. فرقی نمیکند چه زبانی کار کردهاید، کد شما تبدیل شده است به یک زبان میانی مشترک. CLR نمیتواند برای تک تک زبانهای شما یک مفسر داشته باشد. در واقع هر کمپایلر قواعد زبان خود را شناخته و آن را به یک زبان مشترک تبدیل میسازد و حالا CLR میتواند حرف تمامی زبانها را بفهمد. به فایل ساخته شده managed module گویند و به زبانهایی که از این قواعد پیروی نمیکنند unmanaged گفته میشود؛ مثل زبان سی ++ که در دات نت هم managed و هم unmanaged داریم که اولی بدون فریم ورک دات نت کار میکند و مستقیما به کد ماشین تبدیل میشود و دومی نیاز به فریم ورک دات نت داشته و به زبان میانی کامپایل میشود. جدول زیر نشان میدهد که کد همهی زبانها تبدیل به یک نوع شده است.
فایل هایی که ساخته میشوند بر دو نوع هستند؛ یا بر اساس استاندارد windows Portable Executable 32bits برای سیستمهای 32 بیتی و 64 بیتی هستند و یا بر اساس windows Portable Executable 64bits مختص سیستمهای 64 بیتی هستند که به ترتیب PE32 و +PE32 نامیده میشوند که CLR بر اساس این اطلاعات آنها را به کد اجرایی تبدیل میکند. زبانهای CLR همیشه این مزیت را داشتهاند که اصول امنیتی چون DEP یا Data Execution Prevention و همچنین ASLR یا Address Space Layout Randomization در آنها لحاظ شده باشد.
در ادامه مباحث بررسی اجرای برنامههای دات نت بر روی لینوکس، قصد داریم برنامههای ASP.NET را به کمک Mono 3.0 و یک وب سرور لینوکسی، بر روی Ubuntu اجرا کنیم.
پیشنیازها
دو پروژه خالی ASP.NET Web forms و ASP.NET MVC را در VS.NET تحت ویندوز ایجاد نمائید. آنها را یکبار کامپایل کرده و اجرا کنید. سپس فایلهای آنها را به ubuntu منتقل کنید (پوشههای bin پروژهها فراموش نشوند؛ خصوصا نگارش MVC که به همراه یک سری کتابخانه جانبی است).
برای انتقال فایلها به لینوکس، اگر از VMWare workstation برای اجرا و آزمایش Ubuntu استفاده میکنید، کپی و paste مستقیم فایلها از ویندوز به درون ماشین مجازی لینوکس پشتیبانی میشود.
نصب وب سرور آزمایشی مونو یا XSP
اگر نیاز به یک وب سرور آزمایشی، چیزی شبیه به وب سرور توکار VS.NET داشتید، پروژه XSP جهت این نوع آزمایشات ایجاد شده است.
پس از نصب آن (که به همراه همان بسته PPA قسمت قبل، هم اکنون بر روی سیستم شما نصب است)، در ترمینال لینوکس، با استفاده از دستور cd به ریشه وب سایت خود وارد شوید، سپس دستور xsp4 را اجرا کنید تا وب سرور xsp4 مشغول هاست سایت شما شود (برای اجرا در مسیر /opt/bin/xsp4 نصب شده است).
اجرای برنامه ASP.NET Web forms 4 توسط XSP
بدون هیچ مشکل خاصی در همان ابتدای کار اجرا شد (البته باید دقت داشت که لینوکس به کوچکی و بزرگی حروف حساس است. یعنی حتما باید Default.aspx وارد شود و نه default.aspx):
اجرای برنامه ASP.NET MVC 4 توسط XSP
اجرا نشد! پیام میدهد که
و یا
علت اینجا است که XSP4 همراه با نسخه PPA، قدیمی است. بنابراین باید نسخه اصلی را از مخزن کد آن دریافت و کامپایل کنیم. پیشنیازهای اینکار مانند Git و Mono، در قسمت قبل دریافت شدند. سپس فرامین ذیل را در خط فرمان لینوکس اجرا کنید:
پس از کامپایل، اگر این نگارش جدید را اجرا کنید، به خطای ذیل خواهید رسید:
برای رفع این مشکل باید اینبار وب سرور جدید را با فرمان sudo یا دسترسی مدیریتی اجرا کنید تا مشکل برطرف شود.
البته من سورس دریافت شده را در خود monodevelop کامپایل کردم (فایل sln آنرا در monodevelop باز کرده و پروژه را build کنید). در این حالت دو فایل Mono.WebServer.dll و Mono.WebServer.XSP.exe در پوشه xsp/src/Mono.WebServer.XSP/bin/Debug ظاهر میشوند.
یکی دیگر از دلایل ظاهر شدن خطای فوق، نیاز به نصب این دو فایل در GAC است که به نحو زیر قابل انجام میباشد:
بعد این دو فایل dll و exe را در پوشه برنامه MVC خود کپی کنید و سپس دستور ذیل را اجرا نمائید:
اینبار وب سرور جدید، روی پورت 9000 شروع به کار میکند. اکنون اگر در فایرفاکس آدرس http://localhost:9000 را باز کنید، برنامه اجرا شده اما به خطای ذیل خواهید رسید:
برای رفع این مشکل باید اندکی فایل web.config برنامه را ویرایش کرد:
سعی بعدی ... اجرا نشد! با هر بار refresh صفحه یک خطای جدید نمایش میداد که ... Type خاصی را نمیتواند بارگذاری کند (به همراه نام اسمبلی مربوطه). برای رفع این مشکل dllهای ذیل را از پوشه bin پروژه MVC خود که از ویندوز به لینوکس کپی کردهاید، حذف کنید:
Microsoft.Web.Infrastructure.dll
System.Net.Http.dll
System.Net.Http.Formatting.dll
System.Web.Http.dll
System.Web.Http.WebHost.dll
این فایلها توسط تیم Mono به صورت مستقل پیاده سازی شدهاند و نیازی نیست تا از ویندوز به لینوکس کپی شوند.
بعد از حذف این فایلهای اضافی، برنامه ASP.NET MVC نیز اجرا شد:
چند نکته تکمیلی
- نحوه تشخیص موجود بودن یک DLL خاص، در نگارش جاری Mono نصب شده:
- اگر میخواهید مطمئن شوید که تمام اسمبلیهای موجود در GAC درست نصب شدهاند یا خیر، فرمان ذیل را اجرا کنید:
- در نسخه لینوکسی System.Web ممکن است یک سری از فضاهای نام هنوز موجود نباشند. لیست آنها را در این آدرس میتوانید مشاهده کنید:
پیشنیازها
دو پروژه خالی ASP.NET Web forms و ASP.NET MVC را در VS.NET تحت ویندوز ایجاد نمائید. آنها را یکبار کامپایل کرده و اجرا کنید. سپس فایلهای آنها را به ubuntu منتقل کنید (پوشههای bin پروژهها فراموش نشوند؛ خصوصا نگارش MVC که به همراه یک سری کتابخانه جانبی است).
برای انتقال فایلها به لینوکس، اگر از VMWare workstation برای اجرا و آزمایش Ubuntu استفاده میکنید، کپی و paste مستقیم فایلها از ویندوز به درون ماشین مجازی لینوکس پشتیبانی میشود.
نصب وب سرور آزمایشی مونو یا XSP
اگر نیاز به یک وب سرور آزمایشی، چیزی شبیه به وب سرور توکار VS.NET داشتید، پروژه XSP جهت این نوع آزمایشات ایجاد شده است.
پس از نصب آن (که به همراه همان بسته PPA قسمت قبل، هم اکنون بر روی سیستم شما نصب است)، در ترمینال لینوکس، با استفاده از دستور cd به ریشه وب سایت خود وارد شوید، سپس دستور xsp4 را اجرا کنید تا وب سرور xsp4 مشغول هاست سایت شما شود (برای اجرا در مسیر /opt/bin/xsp4 نصب شده است).
اجرای برنامه ASP.NET Web forms 4 توسط XSP
بدون هیچ مشکل خاصی در همان ابتدای کار اجرا شد (البته باید دقت داشت که لینوکس به کوچکی و بزرگی حروف حساس است. یعنی حتما باید Default.aspx وارد شود و نه default.aspx):
اجرای برنامه ASP.NET MVC 4 توسط XSP
اجرا نشد! پیام میدهد که
"Missing method System.Web.Security.FormsAuthentication::get_IsEnabled() in assembly System.Web.dll
Compiler Error Message: CS1703: An assembly with the same identity `mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' has already been imported. Consider removing one of the references
git clone git://github.com/mono/xsp.git cd xsp ./autogen.sh --prefix=/opt make sudo make install
System.IO.FileNotFoundException: Could not load file or assembly XSP, Version=3.0.0.0
البته من سورس دریافت شده را در خود monodevelop کامپایل کردم (فایل sln آنرا در monodevelop باز کرده و پروژه را build کنید). در این حالت دو فایل Mono.WebServer.dll و Mono.WebServer.XSP.exe در پوشه xsp/src/Mono.WebServer.XSP/bin/Debug ظاهر میشوند.
یکی دیگر از دلایل ظاهر شدن خطای فوق، نیاز به نصب این دو فایل در GAC است که به نحو زیر قابل انجام میباشد:
cd xsp/src/Mono.WebServer.XSP/bin/Debug sudo gacutil -i Mono.WebServer.XSP.exe sudo gacutil -i Mono.WebServer.dll
cd myMvcAppPath sudo mono Mono.WebServer.XSP.exe
CS0234: The type or namespace name `Helpers' does not exist in the namespace `System.Web'. Are you missing an assembly reference?
<system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation>
Microsoft.Web.Infrastructure.dll
System.Net.Http.dll
System.Net.Http.Formatting.dll
System.Web.Http.dll
System.Web.Http.WebHost.dll
این فایلها توسط تیم Mono به صورت مستقل پیاده سازی شدهاند و نیازی نیست تا از ویندوز به لینوکس کپی شوند.
بعد از حذف این فایلهای اضافی، برنامه ASP.NET MVC نیز اجرا شد:
چند نکته تکمیلی
- نحوه تشخیص موجود بودن یک DLL خاص، در نگارش جاری Mono نصب شده:
$ gacutil -l Microsoft.Web.Infrastructure The following assemblies are installed into the GAC: Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Number of items = 1
cd /opt/lib/mono/gac # assuming this is your main gac sudo find . */*/*.dll -exec gacutil -i '{}' \;
اشتراکها