前言: IIS會預設把:圖片、JS、HTML、CSS這些文件當成靜態資源處理,為了減少伺服器壓力,預設這些靜態資源是不走URL路由規則控制的。 作為小白及初學者,本人對這些瞭解甚少,補充基礎知識吧: 由於業務需求,新建了一個空的WEB項目,但是需要把原項目中的一些功能Copy過來,如:自定義路由這塊 ...
前言: 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則不受本項目約束。
大家就這麼多吧,沒有仔細驗證,可能有不對的地方,供參考學習使用,以後會繼續完善補充...