IIS6 上的 ASP.NET MVC
-
09-06-2019 - |
题
在哪里可以找到有关在 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 通配符应用程序映射:
- 在 IIS 6 中,转到 ASP.NET MVC Web 应用程序的应用程序配置属性。
- 单击通配符应用程序映射部分中的“插入...”。
- 将可执行文件设置为 aspnet_isapi.dll 的路径(在我的计算机上,这是 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll)。
- 确保不要选中“验证该文件存在”并单击“确定”。
然而,正如 Hack 也提到的,这样做会对性能产生一些影响。
使用 IIS6,您可以执行以下两项操作之一:
- 设置 ISAPI 过滤器以将 MVC URL 映射到 ASP.NET
- 在 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/