web項目自定義路由_實現靜態資源URL控制


前言: IIS會默認把:圖片、JS、HTML、CSS這些文件當成靜態資源處理,為了減少服務器壓力,默認這些靜態資源是不走URL路由規則控制的。

作為小白及初學者,本人對這些了解甚少,補充基礎知識吧: 由於業務需求,新建了一個空的WEB項目,但是需要把原項目中的一些功能Copy過來,如:自定義路由這塊,在接着這塊的時候,遇到了很多問題,后來逐一解決,下面給大家分享下遇到的問題及學到的解決方案,供以后繼續學習使用。

 

第1個問題:空項目如何建立自定義路由?


1-a:為空項目在根目錄下創建全局應用程序類,global.asax.cs文件,global文件的作用是幫助項目處理全局的一些問題,如:項目啟動時,項目發生錯誤時等等,我們用到的路由,就需要在global的監控項目啟動事件里注冊路由。

需要知道的是:global里的事件是在項目的任一文件加載時會自動執行。具體可以參閱,什么是global文件? https://www.cnblogs.com/saywa3b/p/5809434.html

protected void Application_Start(object sender, EventArgs e)
{
    UrlRoutingBus.RegisterRoutes();
}
public class UrlRoutingBus
{
  public static void RegisterRoutes()
  {
    #region Ignore
    //注冊路由忽略的文件類型
    RouteTable.Routes.Ignore("{filename}.png/{*pathInfo}");
    RouteTable.Routes.Ignore("{filename}.jpg/{*pathInfo}");
    RouteTable.Routes.Ignore("{filename}.css/{*pathInfo}");
    RouteTable.Routes.Ignore("{filename}.js/{*pathInfo}");
    RouteTable.Routes.Ignore("{filename}.ashx/{*pathInfo}");    
    #endregion
    const string CULTURE = "culture";     string culture = "en|cn"; RouteValueDictionary constraints = null; foreach (UrlRoutingSetting urlRoutingSetting in UrlRoutingSettingConfig.UrlRoutingSettingCollection) { constraints = new RouteValueDictionary(); foreach (KeyValuePair<string, object> pair in urlRoutingSetting.Constraints) { if (pair.Key.Equals(CULTURE, StringComparison.CurrentCultureIgnoreCase)) { constraints.Add(CULTURE, string.IsNullOrEmpty(culture) ? pair.Value : culture); } else { constraints.Add(pair.Key, pair.Value); } } if (!string.IsNullOrEmpty(urlRoutingSetting.DomainName)) { RouteTable.Routes.Add(new DomainRoute(urlRoutingSetting.DomainName, urlRoutingSetting.RouteUrl, urlRoutingSetting.PhysicalFile, urlRoutingSetting.CheckPhysicalUrlAccess, urlRoutingSetting.Defaults, constraints)); } else if (!string.IsNullOrEmpty(urlRoutingSetting.RouteName)) { if (urlRoutingSetting.RouteName.Equals("ajax", StringComparison.CurrentCultureIgnoreCase)) { RouteTable.Routes.Add(new Route(urlRoutingSetting.RouteUrl, urlRoutingSetting.Defaults, constraints, new HttpHandlerRoute(urlRoutingSetting.PhysicalFile))); } else { RouteTable.Routes.MapPageRoute(urlRoutingSetting.RouteName, urlRoutingSetting.RouteUrl, urlRoutingSetting.PhysicalFile, urlRoutingSetting.CheckPhysicalUrlAccess, urlRoutingSetting.Defaults, constraints); } } } } }

路由配置(給靜態文件Url請求設置路由,這個設置是想實現讓所有的ajax下的js請求都去找一般處理程序;讓所有的Html請求都去找web頁面):

<configSections>
    <section name="urlRoutingSettings" type="UrlRouting.Config.UrlRoutingSettingConfigSection, TLZ.UrlRouting" />
  </configSections>

<urlRoutingSettings>
    <settings>
      <clear />
      <add routeName="ajax" routeUrl="ajax/{0}.js" physicalFile="~/ajax/{0}.ashx" checkPhysicalUrlAccess="true" />
      <add routeName="html_" routeUrl="{0}.html" physicalFile="~/{0}.aspx" />
    </settings>
  </urlRoutingSettings>

 

第2個問題:在完成了自定義路由后,並在項目啟動時添加了注冊方法,我們開始做測試:

 

 

 

 

 發現我們設置的路由並沒有起作用???后來查閱很多資料,並請教老大后才知道,這些都屬於靜態資源。.net默認是不走Url路由規則的,即使我們定義了注冊了路由!!

后來老大給了一個方法:webconfig可以設置強制讓所有的HTTP請求默認走路由規則:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

重新驗證效果,可以請求到頁面:Index.aspx頁面了,成功了,很高興:

到這里我們已經實現了:使用自定義路由控制靜態資源的請求控制。。。  當然我好遇到了一些其他的知識點給大家分享下:

 

第3個問題:如何設置項目默認啟動頁?為什么項目會默認顯示Index.html頁面的內容? 

 

其實這個啟動頁是在IIS里可以看到的,默認的啟動頁是:

 

 

其中index.aspx是我們新加的啟動頁,配置文件會自動生成配置:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
    <defaultDocument>
        <files>
            <add value="index.aspx" />
        </files>
    </defaultDocument>
  </system.webServer>

 

 第4個問題:經過翻閱資料了解到,.net之所以默認靜態資源不走規則控制,是為了節約服務器資源,減少中間處理和請求,提升網頁加載效率的考慮。  那么自己的項目本身頁面是aspx,經過自定義路由改造成.html的URL形式,主要為了什么?

 

項目中原本就是靜態文件的資源,如果多了這一層處理,是不是違背了.net對靜態資源處理的初衷??

第一個小問題的解釋:

這個:需要了解一個概念:“偽靜態”,我們把原本非靜態資源偽裝成靜態資源的形式,這有一些列的好處,最直接的就是:有利於瀏覽器的URL地址收錄;幫助我們隱藏項目結構,有利於安全; 對請求參數的在URL中傳輸方式的改造等等吧。  說的不太准確,這里放一個參考地址: https://baike.baidu.com/item/%E4%BC%AA%E9%9D%99%E6%80%81

第二個小問題的解釋:

我們已經在注冊路由的時候,加了過濾的請求。。第二個如果是請求的靜態資源走的是:http請求,不在當前項目域內的靜態資源,並不受本項目路由約束,如:

<script type="text/javascript" src="js/test.js"></script>
<script type="text/javascript" src="http://www.abc.com/js/test.js"></script>

第一個走的是項目內的規則,第二個JS則不受本項目約束。

 

大家就這么多吧,沒有仔細驗證,可能有不對的地方,供參考學習使用,以后會繼續完善補充...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM