代码之家  ›  专栏  ›  技术社区  ›  Seb Nilsson

iis6上的ASP.NET MVC

  •  25
  • Seb Nilsson  · 技术社区  · 16 年前

    在哪里可以找到一些关于在iis6上运行ASP.NET MVC的最佳实践的好指针?

    对于提供iis7主机的Web主机,我还没有看到任何现实的选择。主要是因为我不住在美国。

    因此,我想知道如何在ASP.NET MVC中构建应用程序,并使其易于部署在IIS6和IIS7上。请记住,这是针对标准Web主机的,因此无法访问iis6中的isapi过滤器或特殊设置。

    在开发ASP.NET MVC应用程序以实现iis6目标时,还有什么需要考虑的吗?有什么不起作用的功能吗?

    更新:更大的问题之一就是Routes的问题。模式控制器/动作将在IIS7上工作,但不在需要控制器.mvc/动作的IIS6上工作。那么,我如何使这个透明化呢?再一次, 无ISAPI 否IIS设置 请。

    8 回复  |  直到 15 年前
        1
  •  14
  •   Jeff    16 年前

    我花了点时间,但我知道如何使扩展与IIS6一起工作。首先,您需要重新编写基路由以包含.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://[website]/ 停止正常工作。那这是怎么解决的呢?

    嗯,你需要定义第二条路线。不幸的是,使用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);
        }
    }
    

    在IIS6下,您的站点应该可以正常工作。(至少在我的电脑上是这样的。)

    另外,如果您在页面中使用html.actionlink(),则不必在整个站点中更改任何其他代码行。此方法负责正确标记控制器的.aspx扩展名。

        2
  •  7
  •   Sean Carpenter    16 年前

    由于无法修改IIS设置以将.mvc映射到ASP.NET,因此可以使用已映射到ASP.NET的其他扩展名。例如,您可以使用controller.ashx/action,它应该在IIS6上开箱即用。

        3
  •  4
  •   Ben Scheirman    16 年前

    如果可以在服务器上安装一个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/

        4
  •  4
  •   PropellerHead    16 年前

    如本文所述 blog post 通过phil hack,可以使用 wildcard application mappings :

    1. 在IIS 6中,转到ASP.NET MVC Web应用程序的应用程序配置属性。
    2. 单击通配符应用程序映射部分中的“插入…”。
    3. 将可执行文件设置为aspnet_isapi.dll的路径(在我的计算机上,这是C:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll)。
    4. 确保不要检查“验证文件是否存在”,然后单击“确定”。

    然而,正如hack所提到的,这样做会带来一些性能方面的影响。

        5
  •  2
  •   Espo    16 年前

    有了iis6,你可以做两件事之一:

    1. 设置ISAPI筛选器以将MVC URL映射到ASP.NET
    2. Include an extension in the URL . 例如:htp://localhost/home.mvc

    由于选项1在大多数Web主机上不可用,因此您必须选择2。

        6
  •  1
  •   Alex Ilyin    15 年前

    URL重写可以帮助您解决这个问题。我已经实现了允许在任何IIS版本上部署MVC应用程序的解决方案,即使使用了虚拟主机。 http://www.codeproject.com/KB/aspnet/iis-aspnet-url-rewriting.aspx

        7
  •  0
  •   anov    15 年前

    我有一个IIs6的申请样本。

    我找到了又快又脏的解决方案。(脏,因为它包含扩展名为的默认视图名)它不需要额外的路由或任何特殊的路由。(除了,您的默认路由必须控制器.aspx/操作…格式)

    这里是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>
    

    我的示例应用程序默认操作是索引,在主目录中。

    注意:我在PhilHaack的博客上看到了这个代码。多亏了布莱恩·洛。

        8
  •  -2
  •   Jim Geurts    16 年前

    我有一个详细的分步指南,但它要求您使用isapi_Rewrite。查看: http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/