在 ASP.NET MVC 4 中,实现用户输入 http://localhost/Htzd/Contact.html 却显示 http://localhost/Home/Index 页面内容的需求,需要采用路由映射技术并结合 Web.config 配置。
一、核心配置文件:RouteConfig.cs
打开 App_Start/RouteConfig.cs 文件,按以下方式配置 RegisterRoutes 方法:
csharp
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// 将 /Htzd/Contact.html 映射到 Home/Index
routes.MapRoute(
name: "HtzdContact",
url: "Htzd/Contact.html",
defaults: new { controller = "Home", action = "Index" }
);
// 默认路由(必须放在最后)
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
注意 :路由匹配遵循从特殊到一般的原则,自定义的特定路由必须放在默认路由之前。
二、关键配置:Web.config
为了使 .html 后缀能被 ASP.NET MVC 路由系统处理,需在 Web.config 的 <system.webServer> 节点中添加 Handler 配置:
xml
<system.webServer>
<handlers>
<add name="HtmlFileHandler" path="*.html" verb="GET,HEAD"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
</system.webServer>
这样配置后,.html 文件请求将被路由系统接管,而非由 IIS 直接作为静态文件处理。
三、完整的调用链路
用户的请求流程如下:
1. 用户访问:http://localhost/Htzd/Contact.html
↓
2. Web.config 中配置的 HtmlFileHandler 使请求进入 ASP.NET 管道
↓
3. RouteConfig 中的路由规则匹配 URL 模式 "Htzd/Contact.html"
↓
4. 路由系统将请求映射到 HomeController 中的 Index 方法
↓
5. 执行 Home/Index 对应的视图,页面内容呈现 http://localhost/Home/Index 的内容
四、原理说明
-
路由系统默认行为 :默认情况下,ASP.NET MVC 会忽略磁盘上实际存在的物理文件请求,直接返回静态文件。如果服务器根目录下存在
Contact.html物理文件,路由规则将不会生效。 -
UrlRoutingModule 模块 :配置 Handler 后,.html 请求会经过 UrlRoutingModule 处理,确保路由规则能够匹配并执行对应的控制器方法,最终在浏览器地址栏仍显示
http://localhost/Htzd/Contact.html地址,呈现的却是Home/Index页面的内容。 -
路由注册 :在
Global.asax的Application_Start事件中调用RouteConfig.RegisterRoutes(RouteTable.Routes)完成路由规则的注册。
⚠️ 不建议配置
runAllManagedModulesForAllRequests="true",该设置会导致所有请求(包括图片、CSS、JS 等静态资源)都经过 HTTP 模块处理,造成性能浪费并可能引发错误。