سؤال

أين يمكنني العثور على بعض المؤشرات الجيدة حول أفضل الممارسات لتشغيل ASP.NET MVC على IIS6؟

لم أر أي خيارات واقعية لمضيفي الويب الذين يقدمون استضافة IIS7 حتى الآن.في الغالب لأنني لا أعيش في الولايات المتحدة.

لذلك كنت أتساءل عن أفضل السبل لبناء التطبيقات في ASP.NET MVC وجعلها متاحة للنشر بسهولة على كل من IIS6 وIIS7.ضع في اعتبارك أن هذا مخصص لمضيفي الويب القياسيين، لذلك لا يمكن الوصول إلى مرشحات ISAPI أو الإعدادات الخاصة داخل IIS6.

هل هناك أي شيء آخر يجب أن يفكر فيه المرء عند تطوير تطبيقات ASP.NET MVC لاستهداف IIS6؟أي وظائف لا تعمل؟

تحديث:واحدة من أكبر القضايا هي الشيء المتعلق بالطرق.سيعمل النمط {controller}/{action} على IIS7، ولكن ليس IIS6 الذي يحتاج إلى {controller}.mvc/{action}.فكيف أجعل هذا شفافًا؟مرة أخرى، لا ISAPI و لا إعدادات IIS, ، لو سمحت.

هل كانت مفيدة؟

المحلول

لقد استغرق الأمر بعض الوقت، لكنني اكتشفت كيفية جعل الامتدادات تعمل مع IIS 6.أولاً، تحتاج إلى إعادة صياغة التوجيه الأساسي ليشمل .aspx بحيث يتم توجيهها عبر عامل تصفية ASP.NET ISAPI.

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.aspx/{action}/{id}",                      // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

إذا انتقلت إلى Home.aspx، على سبيل المثال، فمن المفترض أن يعمل موقعك بشكل جيد.لكن Default.aspx وعنوان الصفحة الافتراضي http://[الموقع]/ التوقف عن العمل بشكل صحيح.فكيف يتم إصلاح ذلك؟

حسنًا، أنت بحاجة إلى تحديد طريق ثانٍ.لسوء الحظ، استخدام Default.aspx كالمسار لا يعمل بشكل صحيح:

routes.MapRoute(
    "Default2",                                             // Route name
    "Default.aspx",                                         // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

فكيف يمكنك الحصول على هذا العمل؟حسنًا، هذا هو المكان الذي تحتاج فيه إلى رمز التوجيه الأصلي:

routes.MapRoute(
    "Default2",                                             // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

عند القيام بذلك، Default.aspx و http://[الموقع]/ كلاهما يبدأ العمل مرة أخرى، على ما أعتقد لأنه تم تعيينهما بنجاح مرة أخرى إلى وحدة التحكم الرئيسية.وبالتالي فإن الحل الكامل هو:

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}.aspx/{action}/{id}",                      // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "Default2",                                              // Route name
            "{controller}/{action}/{id}",                            // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

ويجب أن يبدأ موقعك في العمل بشكل جيد بموجب IIS 6.(على الأقل هذا موجود على جهاز الكمبيوتر الخاص بي.)

وكمكافأة، إذا كنت تستخدم Html.ActionLink() في صفحاتك، فلن تضطر إلى تغيير أي سطر آخر من التعليمات البرمجية في الموقع بأكمله.يعتني هذا الأسلوب بوضع العلامات بشكل صحيح على ملحق .aspx إلى وحدة التحكم.

نصائح أخرى

نظرًا لأنه لا يمكنك تعديل إعدادات IIS لتعيين .mvc إلى ASP.Net، يمكنك استخدام ملحق مختلف تم تعيينه بالفعل إلى ASP.Net.على سبيل المثال، يمكنك استخدام {controller}.ashx/{action} ويجب أن يعمل خارج الصندوق على IIS 6.

لا يتعين عليك التعايش مع هذا الامتداد إذا كان بإمكانك تثبيت مرشح ISAPI على الخادم.

تقوم بشكل أساسي بتوجيه عناوين URL المطابقة إلى مجموعة {controller}.mvc، ثم في ASP.NET تقوم بإعادة كتابة عنوان url هذا لإزالة .mvc - عند القيام بذلك، لا يتعين عليك تحديد أي مسارات إضافية أو كشف .mvc لمستخدميك.

لقد كتبت عن هذا هنا:http://www.flux88.com/UsingASPNETMVConIIS6WithoutTheMVCExtension.aspx

ولدى ستيف ساندرسون مشاركة جيدة هنا أيضًا: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

كما ذكر في هذا مشاركة مدونة بواسطة Phil Hack، من الممكن إعداد عناوين URL بدون امتدادات لـ ASP.NET MVC في IIS 6 باستخدام تعيينات تطبيق البدل:

  1. في IIS 6، انتقل إلى خصائص تكوين التطبيق لتطبيق الويب ASP.NET MVC الخاص بك.
  2. انقر فوق "إدراج..." في قسم خرائط تطبيق Wildcard.
  3. قم بتعيين الملف القابل للتنفيذ على مسار aspnet_isapi.dll (على جهازي هذا هو c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll).
  4. تأكد من عدم تحديد "التحقق من وجود هذا الملف" ثم انقر فوق "موافق".

ولكن كما ذكر Hack أيضًا، هناك بعض الآثار المترتبة على الأداء عند القيام بذلك.

مع IIS6 يمكنك القيام بأحد أمرين:

  1. قم بإعداد مرشح ISAPI لتعيين عناوين URL لـ MVC إلى ASP.NET
  2. قم بتضمين ملحق في عنوان URL.على سبيل المثال:http://localhost/Home.mvc

نظرًا لأن الخيار 1 غير متاح في معظم مضيفي الويب، فيجب عليك اختيار الخيار 2.

يمكن أن تساعدك إعادة كتابة عنوان URL في حل المشكلة.لقد قمت بتنفيذ حل يسمح بنشر تطبيق MVC على أي إصدار من IIS حتى عند استخدام الاستضافة الافتراضية.http://www.codeproject.com/KB/aspnet/iis-aspnet-url-rewriting.aspx

لدي تطبيق عينة على IIS6.

لقد وجدت حلاً سريعًا وقذرًا.(قذر، لأنه يحتوي على اسم العرض الافتراضي مع الامتداد) ولا يتطلب مسارًا إضافيًا أو أي شيء خاص.(باستثناء أن المسار الافتراضي الخاص بك يجب أن يكون {controller}.aspx/{action}...شكل)

هنا الملف default.aspx

<%@ Page Language="C#"%>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    HttpContext.Current.RewritePath("~/Home.aspx/index");
    IHttpHandler httpHandler = new MvcHttpHandler();
    httpHandler.ProcessRequest(HttpContext.Current);
}
</script>

كان الإجراء الافتراضي للتطبيقات النموذجية هو الفهرس في الدليل الرئيسي.

ملحوظة :لقد رأيت هذا الرمز في مدونة Phil Haack.شكرا لبريان لوي.

لدي دليل تفصيلي خطوة بخطوة، ولكنه يتطلب استخدام isapi_rewrite.شاهده على: http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top