ASP.NET 中使用 Routing 进行 URL 优化,规则中的 .html 不起作用的解决方法
使用 ASP.NET 的 Routing 可以很方便地对 ASP.NET Web Form 项目中的 url 进行优化。今天在实际的优化中,发现自己配置的路由规则中的 .html 没有起到作用。
void Application_Start(object sender, EventArgs e) { RouteTable.Routes.RouteExistingFiles = true; RouteTable.Routes.MapPageRoute("home01", "home", "~/admin/default.aspx"); RouteTable.Routes.MapPageRoute("home02", "home.html", "~/admin/default.aspx"); }
上面的代码中,使用规则 home01 ,在地址栏访问 /home 是可以访问到 default.aspx 文件的。因为我想借助 Routing 实现伪静态,于是我定义了规则 home02,在这个规则中,我试图将 home.html 映射到 default.aspx 文件,遗憾的是,并未能如愿,服务器返回了如下错误。
网上寻找了解决方案,在 system.webServer 节点配置 runAllManagedModulesForAllRequests 为 true。
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> </modules> </system.webServer>
如下图,已经可以成功地访问 home.html 了。
一开始满心欢喜,以为问题就这样解决了。虽说这样确实解决了上面所说的 .html 不起作用的问题,但是看到这个模块的名字 runAll 就应该小心,于是继续百度了一下,发现这个解决方案副作用很大。设置了此属性为 true 后,包括一些图片等静态资源在内的所有资源都会经过应用程序的 Application_BeginRequest 事件处理,而像图片、js、css 以及其他一些静态资源文件,直接交由 IIS 处理就可以了,这样无形中增加了 Web 应用程序的压力。
protected void Application_BeginRequest(object sender, EventArgs e) { using (StreamWriter _testData = new StreamWriter(Server.MapPath("~/log/reqdata.txt"), true)) { _testData.WriteLine(Request.Url.ToString()); } }
我在 Application_BeginRequest 事件中记录了日志,证实了这一点。
于是继续百度,找到了下面的解决方案。
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> </modules> <handlers> <add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> </handlers> </system.webServer>
这样,静态资源文件就不会由应用程序来处理了,减轻了应用程序的压力。按照上面的配置,我对我的 Web Form 页面进行测试,又发现了一个问题,当我点击页面中的服务器 button 控件提交页面时,又返回了 404 给我,真是郁闷。后来想了一下,.NET 的服务器 button 控件,提交页面是以 post 方式的,而上面我们配置的 HTTP 谓词只是 GET,于是,在谓词中,追加一个 POST,果真大功告成。
参考文章
上一篇: 我们家有一车的切糕
下一篇: 各系大学男生的不同初夜