关于.net:IIS6上的ASP.NET MVC

关于.net:IIS6上的ASP.NET MVC

ASP.NET MVC on IIS6

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

对于提供IIS7托管的Web托管,我还没有看到任何可行的选择。 主要是因为我不住在美国

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

在开发针对IIS6的ASP.NET MVC应用程序时,还应该考虑什么? 任何功能不起作用?

更新:更大的问题之一是路线问题。 模式{controller} / {action}将在IIS7上工作,但不适用于需要{controller} .mvc / {action}的IIS6。 那么如何使它透明? 同样,请没有ISAPI和IIS设置。


我花了一点时间,但我想出了如何使扩展与IIS 6一起使用。首先,您需要对基本路由进行重新处理以包括.aspx,以便它们将通过ASP.NET ISAPI筛选器进行路由。

1
2
3
4
5
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作为路由无法正常工作:

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

那么如何使它工作呢?好吧,这是您需要原始路由代码的地方:

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

当您这样做时,Default.aspx和http:// [website] /都再次开始工作,我认为是因为它们已成功映射回Home控制器。因此,完整的解决方案是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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扩展名。


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


如Phil Hack在本博客中所提到的,可以使用通配符应用程序映射在IIS 6中为ASP.NET MVC设置无扩展名的URL:

  • 在IIS 6中,转到ASP.NET MVC Web应用程序的"应用程序配置属性"。
  • 单击"通配符应用程序映射"部分中的"插入..."。
  • 将可执行文件设置为aspnet_isapi.dll的路径(在我的计算机上为c:\ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll)。
  • 确保不要选中"验证该文件存在",然后单击"确定"。
  • 但是,正如Hack所提到的那样,这样做会影响性能。


    如果可以在服务器上安装ISAPI筛选器,则不必使用该扩展。

    基本上,您将匹配的URL路由到{controller} .mvc品种,然后在ASP.NET中重写此URL以删除.mvc -这样做无需定义任何额外的路由或向用户公开.mvc。

    我在这里写过:
    http://www.flux88.com/使用ASPNETMVCOnIIS6WithoutTheMVCExtension.aspx

    史蒂夫·桑德森(Steve Sanderson)在这里也有一篇不错的文章:http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/


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

  • 设置一个ISAPI筛选器以将MVC URL映射到ASP.NET
  • 在网址中包含扩展名。例如:htp://localhost/Home.mvc
  • 由于选项1在大多数Web主机上不可用,因此您必须使用数字2。


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


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

    我找到了快速解决方案。 (很脏,因为它包含带有扩展名的默认视图名称)。它不需要其他路由或任何特殊的东西。 (除非,您的默认路由必须为{controller} .aspx / {action} ...格式)

    这是default.aspx

    1
    2
    3
    4
    5
    6
    7
    8
    <%@ 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);
    }

    我的示例应用程序的默认操作是主目录中的index。

    注意:我在Phil Haack的博客中看到了此代码。感谢Brian Lowe。


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


    推荐阅读