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

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

因此,我想知道如何最好地在 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 过滤器进行路由。

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

Steve Sanderson 也在这里发表了一篇很好的文章: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

正如本文中提到的 博客文章 作者 Phil Hack,可以使用以下命令在 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. 确保不要选中“验证该文件存在”并单击“确定”。

然而,正如 Hack 也提到的,这样做会对性能产生一些影响。

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

  1. 设置 ISAPI 过滤器以将 MVC URL 映射到 ASP.NET
  2. 在 URL 中包含扩展名. 。例如:http://localhost/Home.mvc

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

url重写可以帮助你解决问题。我已经实现了允许在任何 IIS 版本上部署 MVC 应用程序的解决方案,即使使用虚拟主机也是如此。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