ASP.NET MVC5實現偽靜態

来源:https://www.cnblogs.com/InCerry/archive/2018/07/30/9390188.html
-Advertisement-
Play Games

[TOC] 因項目需要,對於部分控制器需要實現偽靜態方便搜索引擎優化(SEO),過程比較曲折,簡單的記錄一下。 1.什麼是偽靜態?為什麼要實現偽靜態? 偽靜態:動態網頁通過重寫URL的方法實現去掉動態網頁的參數,但在實際的網頁目錄中並沒有必要實現存在重寫的頁面。 例如:我們當訪問地址http://w ...


目錄


因項目需要,對於部分控制器需要實現偽靜態方便搜索引擎優化(SEO),過程比較曲折,簡單的記錄一下。

1.什麼是偽靜態?為什麼要實現偽靜態?

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

例如:我們當訪問地址http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/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中添加一行代碼.

routes.MapMvcAttributeRoutes();

image_1c563iqie1thv10rtdv3edn1pg19.png-42.8kB

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

筆者是News Action需要實現偽靜態。

[Route("~/News")]
[Route("~/News/{page:int}.html")]

image_1c563p26gp6cbut6lh1qpo1bukm.png-20.7kB

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

在這裡筆者需要給大家科普一下,網上有很多帖子都是直接在Web.Config配置節中添加這樣一句配置代碼。在前面asp.net mvc5 偽靜態 WebForm中作者也是這麼做的,但是我們是不推薦使用這種方式。因為它有較大的性能損失
我會在本文解釋一下原因,想深入探究的朋友可以參考:Link

<modules runAllManagedModulesForAllRequests="true" />

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

imagepng-331kB

所以基於上面這樣一些原因,我們使用單獨配置只對*.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) 驗證

image_1c5659at1p09184bntc15k12u01r.png-14.2kB

已經可以正常訪問,通過我們的偽靜態請求,完成了項目需求。

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

參考文檔

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定義 IOC(Inversion of Control 控制反轉),DIP(Dependency Inverson Principle 依懶倒置)都屬於設計程式時指導原則,並沒有具體的實現。比較常用的五大原則SOLID(SRP單一職責、OCP開閉原則、LSP里氏轉換原則、IOC、DIP) DI(De ...
  • 程式員開發經常涉及到的記憶體區域:堆、棧、靜態存儲區域。 值類型和引用類型的區別: 本章節,暫時只介紹第1個區別:值類型和引用類型在記憶體上的存儲區域。 常用值類型:int、double、bool、char、decimal、struct、enum 常用引用類型:string、自定義類、數組 1.值類型存 ...
  • 記錄一下,方便以後用。。。感覺計算這些亂七八糟的還是有點難的,,,也許是自己還不太熟。。 ...
  • Topshelf 學習 跨平臺 Topshelf是一個開源的跨平臺的宿主服務框架,支持Windows和Mono,只需要幾行代碼就可以構建一個很方便使用的服務宿主。 官網:http://topshelf-project.com GitHub:http://github.com/topshelf/Top ...
  • 使用Common.Logging+log4net規範日誌管理 Common.Logging+(log4net/NLog/) common logging是一個通用日誌介面,log4net是一個強大的具體實現,也可以用其它不同的實現,如EntLib的日誌、NLog等。 Common.Logging可以 ...
  • 最近在做mvc跨控制器傳值的時候發現一個問題,就是有時候TempData的值為null,然後查閱了許多資料,發現了許多都是邏輯什麼的,但是真正解決的辦法什麼的都沒有案例, 於是就把自己的代碼當成案例給貼出來,方便更直觀的解決問題。 因為TempData生命周期確實很短,所以需要持久化一下: 在當前A ...
  • 1、介紹 Logging組件是微軟實現的日誌記錄組件包括控制台(Console)、調試(Debug)、事件日誌(EventLog)和TraceSource,但是沒有實現最常用用的文件記錄日誌功能(可以用其他第三方的如NLog、Log4Net。之前寫過NLog使用的文章)。 2、預設配置 新建.Net ...
  • [TOC] 一、前言 本教程是入門基礎教程,主要是筆者在項目中使用MongoDB .Net官方驅動對MongoDB內嵌文檔的操作時遇到了很多不方便的情況,踩了很多的坑,所以單獨整理出來一篇文章,來講一講筆者踩坑的過程。 筆者水平有限,如有錯誤還請批評指正! (一) 運行環境 .net版本 .Net ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...