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 اضافه خواهند شد.


  • #
    ‫۱۲ سال و ۵ ماه قبل، جمعه ۸ اردیبهشت ۱۳۹۱، ساعت ۰۱:۴۰
    بعضی وقتا نوشتن برنامه یه طرف و راه اندازی اون تو IIS هم یه طرف. واقعا این آموزش هم لازم بود. دستتون درد نکنه. این نکته مهم آخر که فرمودید رو من به طور تجربی باهاش برخورد کردم. net4 رو دوباره نصب کردم حل شد. ولی این دستوری که شما فرمودید مسلما روش بهتریه. متشکر
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۲ مهر ۱۳۹۱، ساعت ۱۰:۱۵
    سلام
    آیا MVC باید روی سرور نصب باشه ؟ یا فقط با نصب .net 4  روی سرور کفایت میکنه . مشکلی که دارم بعد از آپلود فایل‌ها روی سرور از System.web.Helper خطا میگیره و میگه نمی‌تونه این dll رو load کنه .

    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    • #
      ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۲ مهر ۱۳۹۱، ساعت ۱۱:۴۸
      به سرور دار بگید این بسته‌ها را نصب کند:
      MVC 3
      MVC 4

  • #
    ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۲ مهر ۱۳۹۱، ساعت ۱۲:۵۷
    نکته تکمیلی مخصوص IIS6 برای اجرای برنامه‌های MVC:
    IIS Manager ->  select your website ->  Properties -> Home Directory -> 
    Configuration button -> Mappings tab -> Wildcard application maps -> 
    Insert button ->
    a) %windir%\Microsoft.NET\Framework\vXYZ\aspnet_isapi.dll
    b) uncheck “Verify that file exists”

  • #
    ‫۱۱ سال و ۹ ماه قبل، جمعه ۸ دی ۱۳۹۱، ساعت ۱۴:۰۳
    سلام و ادب : لطفا نحوه اجرای یک وب سایت MVC را روی IIS 7 توضیح دهید. چون اگهURL   Action  بنویسم ، حل میشه ولی زمانیکه فقط  LocalHost  را می‌نویسم ارور میده و Route   نمیکنه . مرسی
    • #
      ‫۱۱ سال و ۹ ماه قبل، جمعه ۸ دی ۱۳۹۱، ساعت ۱۵:۰۵
      IIS7 در حالت integrated مطابق متن فوق نیازی به تنظیم خاصی ندارد. همینقدر که آدرس یک اکشن متد را وارد می‌کنید و سایت کار می‌کند یعنی تنظیمات IIS صحیح است. حالت localhost مرتبط است به default route شما در فایل global.asax.cs . بنابراین بهتر است مطلب شماره 4 سری MVC را مطالعه کنید (به همراه کامنت‌های آن).
      • #
        ‫۹ سال و ۱۱ ماه قبل، دوشنبه ۱۹ آبان ۱۳۹۳، ساعت ۱۳:۴۴
        با عرض سلام و تشکر چند سوال داشتم
        1- تنظیم .* در iis5  با خطای wrong extension format مواجه می‌شود آیا راهی برای اصلاح آن وجود دارد.
        2- اگر سیستم مسریابی را پسونددار کنیم چگونه به روش مناسبی می‌توانیم همه جای پروژه را کنترل کنیم که مسیریابی دچار مشکل نشود ازجمله در area
        3- چگونه بفهمیم که iis یکپارچه است یا کلاسیک
        4
        - آیا iis7 مد یکپارچه آن در ویندوز سرور 2003 و 2008 قابل نصب است
        5-آیا برای ویندوز 8 تنظیم خاصی نیاز دارد . من یک مثال ساده را اجرا کردم و برنامه را بر روی iis قرار دادم با خطای 403 forbidden مربوط به صفحه آغازین مواجه شدم
        6- طبق روش گفته شده در آدرس زیر نمی‌توان یک صفحه آغازین دستی درست کرد و در iis تنظیم کرد مثلا deafualt.aspx و در لود آن مستقیما ادامه کار را به داخل مسیریابی mvc  هدایت کرد
        http://weblog.west-wind.com/posts/2013/Aug/15/IIS-Default-Documents-vs-ASPNET-MVC-Routes 
        • #
          ‫۹ سال و ۱۱ ماه قبل، دوشنبه ۱۹ آبان ۱۳۹۳، ساعت ۱۵:۳۶
          - .* نیست. داخل پرانتر نوشتم. درستش *. است.
          - اگر از متدهای توکار خود ASP.NET MVC برای تولید لینک‌ها استفاده کنید، این لینک‌ها صرفا بر مبنای اطلاعات مسیریابی تعریف شده تولید می‌شوند.
          - باید به application pool برنامه مراجعه کنید.
          - روی 2003 خیر. پس از آن به صورت پیش فرض وجود دارد.
          - مراجعه کنید به application pool برنامه. احتمالا روی دات نت 2 است؛ بجای 4.
          توضیحات بیشتر در اینجا
          - یک اکشن متد ساده برای صفحه‌ی Home طراحی کنید.
          • #
            ‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۲۰ آبان ۱۳۹۳، ساعت ۱۲:۵۸
            با سلام و عرض ارادت
            در iis5 مربوط به ویندوز ایکس پی هر نوع .* یا *.* یا *. وارد کنید خطا می‌گیرد.
            در مورد شماره 2 چگونه می‌توان با متدهای توکار مثلا چنین ویویی را برگرداند return View("/Account/Index.cshtml")
            در مورد شماره 5 چک کردم هم فریم ورک 4 است و هم application pool بصورت یکپارچه تعریف شده ولی باز خطای فوق را می‌دهد
            در مورد شماره 6 اگر امکان دارد بیشتر توضیح دهید
            با تشکر فراوان
            • #
              ‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۲۰ آبان ۱۳۹۳، ساعت ۱۳:۱۸
              - گزینه‌ی «"uncheck “Verify that file exists» را هم امتحان کنید.
              - این سؤال خارج از بحث است. بازگرداندن View هیچ ارتباطی به مسیریابی ندارد. فقط کافی است بنویسید:
              return View("~/Views/....مسیر کامل فایل", model);
              تولید URLهای خودکار بر اساس اطلاعات مسیریابی در Viewهای برنامه، توسط متدهای توکار ActionLink و امثال آن انجام می‌شود.
              - تمام خطاهای مدیریت نشده‌ی برنامه‌های وب در لاگ ویندوز ثبت می‌شوند. آن‌ها را بررسی کنید. همچنین ELMAH را هم نصب کنید تا خطاها را برای بررسی بیشتر لاگ کند.
              - روش‌های قدیمی را با MVC کار نکنید. صفحه‌ی اول سایت، همان صفحه‌ای است که در مسیریابی پیش فرض تعریف شده‌است. یعنی همان اکشن متد Index در کنترلر Home، به همراه View ایی که مد نظر شما است.
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، چهارشنبه ۶ آذر ۱۳۹۲، ساعت ۲۱:۳۳
    آیا امکان داره در سروری mvc نصب نباشه ولی یک سایت mvc رو اجرا کنیم
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، چهارشنبه ۶ آذر ۱۳۹۲، ساعت ۲۲:۲۵
      بله. از IIS 7 به بعد که بر روی آن سیستم حداقل دات نت 4 نصب باشد. البته با IIS 6 هم می‌شود؛ ولی ابتدا باید تنظیمات عنوان شده در بحث را به IIS6 اعمال کرد.
      در VS 2010 روی پروژه در VS.NET کلیک راست کنید و سپس گزینه «Add Deployable Dependency» را انتخاب کنید. در این حالت فایل‌های DLL لازم برای اجرای ASP.NET MVC به داخل پوشه جدید _bin_deployableAssemblies برنامه شما کپی می‌شوند (اطلاعات بیشتر و اینجا). این نکته در مورد MVC3 است. در MVC4 به صورت پیش فرض تمام DLLهای لازم داخل پوشه bin کپی می‌شوند (خاصیت Copy Local ارجاعات پروژه به true تنظیم شده) و گزینه یاد شده از VS 2012 به بعد حذف شده و نیازی به آن نیست.
      در حالت کلی ASP.NET MVC را در IISهای 7 به بعد، از طریق bin deploy (یعنی کپی کردن dllهای لازم به سرور) می‌شود اجرا کرد و نیازی به نصب یا تنظیمات اضافه‌تری ندارد.
      این ارجاعات هم به شرح زیر هستند:
          Microsoft.Web.Infrastructure
          System.Web.Helpers
          System.Web.Mvc
          System.Web.Razor
          System.Web.WebPages
          System.Web.WebPages.Deployment
          System.Web.WebPages.Razor
      اگر تعدادی از این‌ها در لیست ارجاعات پروژه شما نیستند (چون در GAC نصب شدند) فقط کافی است از طریق صفحه Add reference ارجاعات لازم را اضافه و سپس گزینه Copy local آن‌ها را true کنید.
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، چهارشنبه ۲۰ آذر ۱۳۹۲، ساعت ۲۱:۰۷
    با سلام از زمانی که سرورمو عوض کردم پروژه‌های mvc برام بالا نمیاد یعنی دستی که آدرسو میزنم run میشه
    ولی دیفالت روت خودش عمل نمیکنه و از  webconfig خطا میگیره
    www.test.com>>>>>>>>webconfig Erorr
    www.test.com/home.index<<<<<is True
    رو سرورم iis7 ,dotnet 4 نصب ولی هنوز دیفالت روت مشکل داره.
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، چهارشنبه ۲۰ آذر ۱۳۹۲، ساعت ۲۱:۳۶
      بسته‌های کامل MVC نصب هستند روی سرور؟
      ELMAH  را به برنامه اضافه کنید تا جزئیات خطاها را بهتر بتوانید لاگ و مشاهده کنید (مهم).
      همچنین این خطاها در قسمت لاگ‌های سرور هم ثبت می‌شوند که بهتر است جزئیات آن‌ها را بررسی کنید.