IIS6 上的 ASP.NET MVC

Posted

技术标签:

【中文标题】IIS6 上的 ASP.NET MVC【英文标题】:ASP.NET MVC on IIS6 【发布时间】:2010-09-07 05:53:17 【问题描述】:

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

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

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

在开发面向 IIS6 的 ASP.NET MVC 应用程序时,还有什么其他需要考虑的吗?有什么不能用的功能吗?

更新:更大的问题之一是路线问题。 controller/action 模式适用于 IIS7,但不适用于需要 controller.mvc/action 的 IIS6。那么如何让这个透明呢?请再次无 ISAPI无 IIS 设置

【问题讨论】:

感谢这个问题 - 我很幸运地偶然发现了这个问题,然后花了很多时间在 MVC 中的一个新项目上,该项目必须在 IIS6 下运行。很高兴在我走得太远之前知道这是一个问题...... 【参考方案1】:

我花了一点时间,但我想出了如何使扩展与 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 扩展名。

【讨论】:

请记住,如果您决定切换到 IIS7 并删除 .aspx,那么您的 SEO 将会一团糟。您需要保留旧路由,以便将来“找到”您 第二个路由只需要一个带有空白 url 值的根路由: routes.MapRoute("Root","", new controller = "Home",action = "Index",id = "");【参考方案2】:

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

【讨论】:

鉴于 OP,这是最恰当的一个。什么鬼,人们?【参考方案3】:

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

【讨论】:

【参考方案4】:

正如 Phil Hack 在 blog post 中提到的,可以使用 wildcard application mappings 在 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 也提到的,这样做会对性能产生一些影响。

【讨论】:

来自blog.stevensanderson.com:原来你可以disable wildcard maps on selected subfolders,这可能会让你两全其美。【参考方案5】:

使用 IIS6,您可以做以下两件事之一:

    设置 ISAPI 过滤器以将 MVC URL 映射到 ASP.NET Include an extension in the URL。例如:htp://localhost/Home.mvc

由于大多数网络主机不提供选项 1,因此您必须选择 2。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于IIS6 上的 ASP.NET MVC的主要内容,如果未能解决你的问题,请参考以下文章

将所有请求重定向到 IIS6 上的 ASP.NET MVC

IIS 6 上的 ASP.NET 路由

IIS 6 上的 ASP.NET MVC - 通配符映射 - 传入请求与任何路由都不匹配

asp.net怎么配置IIS6

windows2003 IIS6.0右键属性没有asp.net选项卡的解决办法

求助:环境win2003 sp2+iis6.0+asp+asp.net2.0,死活访问不了ASP文件,html是可以访问的,详情见下面。