۱۳۹۱/۰۲/۰۷

ASP.NET MVC #23


اجراي برنامه‌هاي ASP.NET MVC توسط نگارش‌هاي متفاوت IIS

تا اينجا براي اجراي برنامه‌هاي ASP.NET MVC از وب سرور توكار VS.NET استفاده شد كه صرفا جهت آزمايش برنامه‌ها طراحي شده است. تا اين تاريخ سه رده از وب سرورهاي مايكروسافت ارائه شده‌اند كه براي نصب ASP.NET MVC مي‌توانند مورد استفاده قرار گيرند و هر كدام هم نكته‌هاي خاص خودشان را دارند كه در ادامه به بررسي آن‌ها خواهيم پرداخت.


اجراي برنامه‌هاي ASP.NET MVC بر روي IIS 5.x ويندوز XP

پس از ايجاد يك دايركتوري مجازي بر روي پوشه يك برنامه ASP.NET MVC و سعي در اجراي برنامه، بلافاصله پيغام خطاي HTTP 403 forbidden مشاهده مي‌شود.
اولين كاري كه براي رفع اين مساله بايد صورت گيرد، كليك راست بر روي نام دايركتوري مجازي در كنسول IIS، انتخاب گزينه خواص و سپس مراجعه به برگه «ASP.NET» آن است. در اينجا شماره نگارش دات نت فريم ورك مورد استفاده را به 4 تغيير دهيد (براي نمونه ASP.NET MVC 3.0 مبتني بر دات نت فريم ورك 4 است).
بعد از اين تغيير، بازهم موفق به اجراي برنامه‌هاي ASP.NET MVC بر روي IIS 5.x نخواهيم شد؛ چون در آن زمان مفاهيم مسيريابي و Routing كه اصل و پايه ASP.NET MVC هستند وجود خارجي نداشتند. اين نگارش از IIS به صورت پيش فرض تنها قادر به پردازش درخواست‌هاي رسيده‌اي كه به يك فايل فيزيكي بر روي سرور اشاره مي‌كند، مي‌باشد (يعني مشكلي با اجراي برنامه‌هاي ASP.NET Web forms ندارد).
براي رفع اين مشكل، مجددا بر روي نام دايركتوري مجازي برنامه در كنسول IIS كليك راست كرده و گزينه خواص را انتخاب كنيد. در صفحه ظاهر شده، در برگه «Virtual directory» آن، بر روي دكمه «Configuration» كليك نمائيد. در صفحه باز شده مجددا بر روي دكمه «Add» كليك كنيد.
در صفحه باز شده، مسير Executable را C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll وارد كرده و Extension را به .* (دات هرچي) تنظيم كنيد. همين مقدار تنظيم، براي اجراي برنامه‌هاي ASP.NET MVC بر روي IIS 5.x ويندوز XP كفايت مي‌كند.

كاري كه در اينجا انجام شده است، نگاشت تمام درخواست‌هاي رسيده صرفنظر از پسوند فايل‌ها، به موتور ASP.NET مي‌باشد. به صورت پيش فرض در IIS 5.x درخواست‌ها تنها بر اساس پسوند فايل‌ها پردازش مي‌شوند. مثلا اگر فايل درخواستي aspx است، درخواست رسيده به aspnet_isapi.dll ياد شده هدايت خواهد شد. اگر پسوند فايل php است به isapi مخصوص آن (در صورت نصب) هدايت مي‌گردد و به همين ترتيب براي ساير سيستم‌هاي ديگر. زمانيكه Extension به «دات هرچي» و Executable به aspnet_isapi.dll دات نت 4 تنظيم مي‌شود، دايركتوري مجازي تنظيم شده تنها جهت سرويس دهي به يك برنامه ASP.NET عمل خواهد كرد و تمام درخواست‌هاي رسيده به آن، به موتور اجرايي ASP.NET هدايت مي‌شوند.

بديهي است تنظيمات فوق تنها به يك دايركتوري مجازي اعمال شدند. اگر نياز باشد تا بر روي تمام سايت‌ها تاثير گذار شود، اينبار در كنسول IIS 5.x بر روي «Default web site» كليك راست كرده و گزينه خواص را انتخاب كنيد. در صفحه باز شده به برگه «Home directory» مراجعه كرده و مراحل ذكر شده را تكرار كنيد.

مشكل! اين روش بهينه نيست.
روش فوق خوبه، كار مي‌كنه، اما بهينه نيست؛ از اين جهت كه «نگاشت تمام درخواست‌ها به موتور ASP.NET» يعني پروسه پردازش درخواست يك فايل تصويري، js يا css هم بايد از فيلتر موتور ASP.NET عبور كند كه ضروري نيست.
براي رفع اين مشكل، توصيه شده است كه سيستم مسيريابي ASP.NET MVC را در IIS 5.x «پسوند دار» كنيد. به اين نحو كه با مراجعه به فايل Global.asax.cs، تعاريف مسيريابي را به نحو زير ويرايش كنيد:

public static void RegisterRoutes(RouteCollection routes)
{
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       routes.Add(
                new Route("{controller}.aspx/{action}/{id}", new MvcRouteHandler()) 
                {
                    Defaults = new RouteValueDictionary(new 
                    {
                        controller = "Home",
                        action = "Index",
                        id = UrlParameter.Optional
                    }) 
                });



اينبار براي مثال مسير http://localhost/MyMvcApp/home.aspx/index به علت داشتن پسوند aspx وارد موتور پردازشي ASP.NET خواهد شد. البته در اين حالت URL هاي تميز ASP.NET MVC را از دست خواهيم داد و مدام بايد دقت داشت كه مسيرهاي كنترلرها حتما بايد به aspx ختم شوند. ضمنا با اين تنظيم، ديگر نيازي به تغيير تعاريف نگاشت‌ها در كنسول مديريتي IIS، نخواهد بود.


اجراي برنامه‌هاي ASP.NET MVC بر روي IIS 6.x ويندوز سرور 2003

تمام نكات عنوان شده جهت IIS 5.x در IIS 6.x نيز صادق هستند. به علاوه براي اجراي برنامه‌هاي ASP.NET بر روي IIS 6.x بايد به دو نكته مهم ديگر نيز دقت داشت:
الف) ASP.NET 4 به صورت پيش فرض در IIS 6.x غيرفعال است كه بايد با مراجعه به قسمت Web Services Extensions در كنسول مديريتي IIS، آن‌را از حالت prohibited خارج كرد.
ب) در هر Application pool تنها از يك نگارش دات نت فريم ورك مي‌توان استفاده كرد. براي مثال اگر هم اكنون AppPool1 مشغول سرويس دهي به يك سايت ASP.NET 3.5 است، از آن نمي‌توانيد جهت اجراي برنامه‌هاي ASP.NET MVC 3 به بعد استفاده كنيد. زيرا براي مثال ASP.NET MVC 3 مبتني بر دات نت فريم ورك 4 است. به همين جهت حتما نياز است تا يك Application pool مجزا را براي برنامه‌هاي دات نت 4 در IIS 6 اضافه نمائيد و سپس در تنظيمات سايت، از اين Application pool جديد استفاده نمائيد.
البته روش صحيح و اصولي كار با IIS از نگارش 6 به بعد هم مطابق شرحي است كه عنوان شد. براي دستيابي به بهترين كارآيي و امنيت بيشتر، بهتر است به ازاي هر سايت، از يك Application pool مجزا استفاده نمائيد.

اطلاعات تكميلي:
نکات نصب برنامه‌هاي ASP.NET 4.0 بر روي IIS 6
مروري بر تاريخچه محدوديت حافظه مصرفي برنامه‌هاي ASP.NET در IIS



اجراي برنامه‌هاي ASP.NET MVC بر روي IIS 7.x ويندوز 7 و ويندوز سرور 2008

اگر برنامه ASP.NET MVC در IIS 7.x در حالت يكپارچه (integrated mode) اجرا شود، بدون نياز به هيچگونه تغييري در تنظيمات سرور يا برنامه، بدون مشكل قابل اجرا خواهد بود. بديهي است در اينجا نيز بهتر است به ازاي هر برنامه، يك Application pool مجزا را ايجاد كرد.
اما در حالت classic (كه براي برنامه‌هاي جديد توصيه نمي‌شود) نياز است همان مراحل IIS 5,x تكرار شود. البته اينبار مسير زير را بايد طي كرد تا به صفحه افزودن نگاشت‌ها رسيد:
Right-click on a web site -> Properties -> Home Directory tab -> click on the Configuration button -> Mappings tab



نكته‌اي مهم در تمام نگارش‌هاي IIS

ترتيب نصب دات نت فريم ورك 4 و IIS مهم است. اگر ابتدا IIS نصب شود و سپس دات نت فريم ورك 4، به صورت خودكار، كار نگاشت اطلاعات ASP.NET به IIS صورت خواهد گرفت.
اگر ابتدا دات نت فريم ورك 4 نصب شود و سپس IIS، براي مثال ديگر از برگه ASP.NET در IIS 6.x خبري نخواهد بود. براي رفع اين مشكل دستور زير را در خط فرمان اجرا كنيد:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe /i

به اين ترتيب، اطلاعات مرتبط با موتور ASP.NET مجددا به تنظيمات IIS اضافه خواهند شد.