欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET 中使用 Routing 进行 URL 优化,规则中的 .html 不起作用的解决方法

程序员文章站 2022-10-05 17:34:05
使用 ASP.NET 的 Routing 可以很方便地对 ASP.NET Web Form 项目中的 url 进行优化。今天在实际的优化中,发现自己配置的路由规则中的 .html 没有起到作用。 上面的代码中,使用规则 home01 ,在地址栏访问 /home 是可以访问到 default.aspx ......

使用 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 文件,遗憾的是,并未能如愿,服务器返回了如下错误。

ASP.NET 中使用 Routing 进行 URL 优化,规则中的 .html 不起作用的解决方法

网上寻找了解决方案,在 system.webServer 节点配置 runAllManagedModulesForAllRequests 为 true

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
    </modules>
  </system.webServer>

如下图,已经可以成功地访问 home.html 了。

ASP.NET 中使用 Routing 进行 URL 优化,规则中的 .html 不起作用的解决方法

 

一开始满心欢喜,以为问题就这样解决了。虽说这样确实解决了上面所说的 .html 不起作用的问题,但是看到这个模块的名字 runAll 就应该小心,于是继续百度了一下,发现这个解决方案副作用很大。设置了此属性为 true 后,包括一些图片等静态资源在内的所有资源都会经过应用程序的 Application_BeginRequest 事件处理,而像图片、jscss 以及其他一些静态资源文件,直接交由 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 事件中记录了日志,证实了这一点。

ASP.NET 中使用 Routing 进行 URL 优化,规则中的 .html 不起作用的解决方法

 于是继续百度,找到了下面的解决方案。

  <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,果真大功告成。

 

参考文章