IIS6上的ASP.NET MVC

时间:2008-08-29 08:45:20

标签: .net asp.net-mvc deployment iis-6

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

我还没有看到任何提供IIS7托管的网络主机的现实选项。主要是因为我不住在美国。

所以我想知道如何在ASP.NET MVC中最好地构建应用程序,并使其可以轻松地在IIS6和IIS7上部署。请记住,这适用于标准Web主机,因此无法访问IIS6中的ISAPI过滤器或特殊设置。

在开发ASP.NET MVC应用程序以定位IIS6时,还有什么需要考虑的吗?任何不起作用的功能?

更新:其中一个更大的问题是路线问题。模式{controller} / {action}将适用于IIS7,但不适用于需要{controller} .mvc / {action}的IIS6。那么我该如何透明呢?请再次没有ISAPI 没有IIS设置

8 个答案:

答案 0 :(得分:14)

我花了一些时间,但我想出了如何使扩展与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://[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://[website]/都会重新开始工作,我认为因为它们已成功映射回Home控制器。所以完整的解决方案是:

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下开始正常工作。(至少它在我的PC上运行。)

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

答案 1 :(得分:7)

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

正如Phil Hack在blog post中所提到的,可以使用wildcard application mappings在IIS 6中为ASP.NET MVC设置无扩展名的URL:

  1. 在IIS 6中,转到ASP.NET MVC Web应用程序的“应用程序配置属性”。
  2. 点击通配符应用程序地图部分中的“插入...”。
  3. 将可执行文件设置为aspnet_isapi.dll的路径(在我的机器上,这是c:\ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll)。
  4. 请确保不要选中“验证文件是否存在”并单击“确定”。
  5. 然而正如Hack所提到的,这样做有一些性能影响。

答案 4 :(得分:2)

使用IIS6,您可以执行以下两项操作之一:

  1. 设置ISAPI筛选器以将MVC URL映射到ASP.NET
  2. Include an extension in the URL。例如:htp://localhost/Home.mvc
  3. 由于选项1在大多数网络主机上都不可用,因此您必须选择2号。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

我在IIS6上有一个示例应用程序。

我发现了快速而肮脏的解决方案。 (脏,因为它包含带扩展名的默认视图名称)它不需要额外的路由或任何特殊的路由。 (除非您的默认路由必须为{controller} .aspx / {action} ... format)

这里是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的博客上看到了这段代码。感谢Brian Lowe。

答案 7 :(得分:-2)

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

查看