当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET 中使用 Routing 进行 URL 优化,规则中的 .html 不起作用的解决方法

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

2018年06月14日  | 移动技术网IT编程  | 我要评论

异界之我会武功,端木新卉老公,国民党中统

使用 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 事件处理,而像图片、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 事件中记录了日志,证实了这一点。

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

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

 

参考文章

  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网