天天看點

ASP.NET MVC5實作僞靜态ASP.NET MVC5實作僞靜态參考文檔

ASP.NET MVC5實作僞靜态

目錄

  • ASPNET MVC5實作僞靜态
    • 目錄
    • 什麼是僞靜态為什麼要實作僞靜态
    • 實作APSNET MVC僞靜态的方式有哪些
    • 那麼如何實作使用ASPNET MVC5的僞靜态呢
      • 1在路由注冊中啟用特性路由
      • 2為需要僞靜态的方法添加特性路由
      • 3 在WebConfig中為html路徑配置處理程式
      • 4 驗證
  • 參考文檔
因項目需要,對于部分控制器需要實作僞靜态友善搜尋引擎優化(SEO),過程比較曲折,簡單的記錄一下。
           

1.什麼是僞靜态?為什麼要實作僞靜态?

僞靜态:動态網頁通過重寫URL的方法實作去掉動态網頁的參數,但在實際的網頁目錄中并沒有必要實作存在重寫的頁面。

例如:我們當通路位址http://*/2529259.html時,你會認為在站點伺服器下存在名為2529259.html檔案,其實實際上它可能是不存在的,而可能你看到的内容是通過重定向/archive/article.aspx?year=2012&month=06&day=05&id=2529259顯示出來的。

為什麼要這樣做呢?

(1)增強URL的友好性,友善使用者記憶URL。

(2)提高搜尋引擎抓取,很多搜尋引擎更看好靜态HTML頁。

(3)加強安全性,因為隐藏了參數”year”、”month”、”day”、”id”,使網站沒有那麼容易受到攻擊。

以上内容摘選自:ASP.NET僞靜态實作

2.實作APS.NET MVC僞靜态的方式有哪些?

  1. 通過實作接口IHttpHandler來接管HTTP請求,這裡需要使用URLRewriter這個擴充,大家可以在NuGet管理工具中下載下傳。想通過這種方式大家可以參考這篇幾篇文章:ASP.NET僞靜态實作ASP.NET MVC4通過UrlRewriter配置僞靜态
  2. 通過配置預設路由的方式來實作僞靜态。這種是比較常用的方法之一,大家可以參考這篇文章:asp.net mvc5 僞靜态 WebForm
  3. 通過使用ASP.NET MVC5特性路由的方式,這就是本文使用的方式,為什麼筆者使用這種方式呢?是因為我們項目是一個老項目添加新功能,如果貿然全站僞靜态那麼很多寫好的代碼需要返工,如果項目中隻有少數幾個控制器需要僞靜态那麼我也建議使用這種方式。

3.那麼如何實作使用ASP.NET MVC5的僞靜态呢?

同樣,分為幾個步驟。

(1)在路由注冊中啟用特性路由

如果大家不懂什麼是特性路由,可以參考這篇文章

就是在/App_Start/RouteConfig.cs中添加一行代碼.

ASP.NET MVC5實作僞靜态ASP.NET MVC5實作僞靜态參考文檔

(2)為需要僞靜态的方法添加特性路由

筆者是News Action需要實作僞靜态。

[Route("~/News")]
[Route("~/News/{page:int}.html")]
           
ASP.NET MVC5實作僞靜态ASP.NET MVC5實作僞靜态參考文檔

(3) 在Web.Config中,為*.html路徑配置處理程式。

在這裡筆者需要給大家科普一下,網上有很多文章都是直接在Web.Config配置節中添加這樣一句配置代碼。在前面asp.net mvc5 僞靜态 WebForm中作者也是這麼做的,但是我們是不推薦使用這種方式。因為它有較大的性能損失。

我會在本文解釋一下原因,想深入探究的朋友可以參考:Link

大家可以看上圖,這是IIS 7.0的處理機制,大家可以看到ExecuteHandler這個部分,預設情況下的話是通過這樣一個機制來處理,如果我們使用這個配置項,那麼不管是CGI、靜态檔案都是通過ISAPI也就是我們的ASP.NET程式來執行,一些Js檔案、css檔案或者圖檔都會走我們的ASP.NET程式,那麼将會造成很多性能損失,這是我所在乎的一個原因,當然還有關于IIS身份驗證等問題。有興趣的朋友可以參考這篇文章:Link

ASP.NET MVC5實作僞靜态ASP.NET MVC5實作僞靜态參考文檔

是以基于上面這樣一些原因,我們使用單獨配置隻對*.html進行配置,那麼其它靜态檔案都是走IIS 7.0預設處理程式,隻有需要達到僞靜态的.html才進入ASP.NET進行處理。以下是配置節。

<system.webServer>
    <handlers>
      <add name="Static64" path="*.html" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"  preCondition="classicMode,runtimeVersionv4.0,bitness64" />
      <add name="Static32" path="*.html" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll"  preCondition="classicMode,runtimeVersionv4.0,bitness32" />
      <add name="(Static) ExtensionlessUrlHandler-Integrated-4.0" path="*.html" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
           

大家可以發現我分别添加了Static64、Static32、(Static) ExtensionlessUrlHandler-Integrated-4.0三個配置,其中主要的功能就是将*.html為後戳的請求交給aspnet_isapi進行處理。關于該配置節的具體資訊,大家可以參考MSDN

(4) 驗證

ASP.NET MVC5實作僞靜态ASP.NET MVC5實作僞靜态參考文檔

已經可以正常通路,通過我們的僞靜态請求,完成了項目需求。

筆者水準有限,如果錯誤歡迎大家批評指正!
           

參考文檔

https://www.cnblogs.com/ForEvErNoME/archive/2012/06/14/2549313.html

https://www.cnblogs.com/ForEvErNoME/archive/2012/06/14/2549313.html

http://blog.csdn.net/just_shunjian/article/details/51132866

https://www.cnblogs.com/zengpeng/p/5899885.html

https://www.cnblogs.com/zengpeng/p/5899885.html

https://www.cnblogs.com/xishuai/archive/2015/01/06/Styles-Render-runAllManagedModulesForAllRequests-true.html

http://blog.csdn.net/shandian84/article/details/40903663

https://msdn.microsoft.com/zh-cn/library/bb763179%28v=vs.100%29.aspx

繼續閱讀