Taurus.MVC WebAPI 入門開發教學6:全域性控制器DefaultController與全域性事件。

2022-08-12 18:05:42

系列目錄

1、Taurus.MVC WebAPI  入門開發教學1:框架下載環境設定與執行。

2、Taurus.MVC WebAPI 入門開發教學2:新增控制器輸出Hello World。

3、Taurus.MVC WebAPI 入門開發教學3:路由型別和路由對映。

4、Taurus.MVC WebAPI 入門開發教學4:控制器方法及引數定義、獲取及基礎校驗屬性【Require】。

5、Taurus.MVC WebAPI 入門開發教學5:控制器安全校驗屬性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。

6、Taurus.MVC WebAPI 入門開發教學6:全域性控制器DefaultController與全域性事件。

7、Taurus.MVC WebAPI 入門開發教學7:業務邏輯基礎類別LogicBase的使用。

8、Taurus.MVC WebAPI 入門開發教學8:WebAPI檔案與自動化測試。

後續還有兩個系列:

1、Taurus.MVC 微服務 入門開發教學系列。

2、Taurus.MVC Web應用 入門開發教學系列。
 

前言:

全域性控制器的作用:

1、可接收所有的404請求,做統一處理。

2、可以實現一些公共的全域性的事件。

接收404的過程詳細的描述:

對於Taurus.MVC中執行的請求,如果沒有對應的控制器接收,預設產生404;

如果專案中存在DefaultController全域性控制器,則轉交給DefaultController。

如果DefaultController沒有對應的方法接收,仍產生404。
如果需要對所有的404請求,做統一的處理輸出,則可以過載Default方法,

該方法為最終方法,它可以接收所有的404請求。

下面介紹:全域性控制器中的全域性事件,檔案有點類似以前的Global.cs的味道。

全域性控制器的完整方法與註釋說明:

/// <summary>
    /// 全域性控制器(適全全域性事件處理)
    /// </summary>
    public class DefaultController : Taurus.Core.Controller
    {
        /// <summary>
        /// 所有定址不到的請求都集中執行到此方法(不想接收404則刪除此過載方法即可)。
        /// </summary>
        public override void Default()
        {
            Write("DefaultController : Hello world");
        }
        /// <summary>
        /// 用於所有的請求合法性驗證,配合[Ack]屬性
        /// 啟用時:區域性的先執行(若存在),無區域性才執行全域性。
        /// </summary>
        public static bool CheckAck(IController controller, string methodName)
        {
            //需要自己實現Ack驗證
            return !string.IsNullOrEmpty(controller.Query<string>("ack"));

        }

        /// <summary>
        /// 用於需要登陸後的身份驗證,配合[Token]屬性
        /// 啟用時:區域性的先執行(若存在),無區域性才執行全域性。
        /// </summary>
        public static bool CheckToken(IController controller, string methodName)
        {
            //需要自己實現,或者通過設定Taurus.Auth啟動自帶的驗證(自帶的註釋掉此方法即可)。
            return !string.IsNullOrEmpty(controller.Query<string>("token"));
        }

        /// <summary>
        /// 用於校驗微服務的內部身份驗證,配合[MicroService]屬性
        /// 啟用時:全域性僅此一個生效,區域性的失效。
        /// </summary>
        public static bool CheckMicroService(IController controller, string methodName)
        {
            return MicroService.Config.ServerKey == controller.Query<string>(MicroService.Const.HeaderKey);
        }

        /// <summary>
        /// 全域性【路由對映】
        /// 啟用時:所有請求都進入此地做對映(需要對映時,返回對映的地址;不需要對映的返回空即可)。
        /// </summary>
        public static string RouteMapInvoke(HttpRequest request)
        {
            //if (request.Url.LocalPath.StartsWith("/api/") && RouteConfig.RouteMode == 2)
            //{
             //   return "/test" + request.RawUrl;
            //}
            return string.Empty;
        }
        /// <summary>
        /// 全域性【方法執行前攔截】
        /// 啟用時:先全域性,再執行區域性(若存在)。
        /// </summary>
        public static bool BeforeInvoke(IController controller, string methodName)
        {
            return true;
        }
        /// <summary>
        /// 全域性【方法執行後業務】
        /// 啟用時:先執行區域性(若存在),再執行全域性。
        /// </summary>
        public static void EndInvoke(IController controller, string methodName)
        {

        }
    }

全域性方法都是靜態方法,手寫不太方便,對於有全域性控制需要的,可以從此處Copy過去要用到的方法,不需要的忽略或註釋掉。

下面補充其它說明:

其它1、全域性攔截404的方法補充說明:

通過全域性攔截後,預設會變成自定義方式:

1、正常處理流程,輸出的狀態碼為200,如果需要返回404狀態碼,設定輸出的狀態碼即可,如:

        public override void Default()
        {
            Response.StatusCode = 404;
            Write("DefaultController : Hello world");
        }

2、如果想返回自定義頁面,有兩種方式:

1、直接讀取檔案路徑,然後Write出去即可。

2、利用小技巧,讓它直接觸發MVC的頁面載入機制即可,按路徑存放頁面即可:/Views/Default/Default.html。

其它2、全域性方法的效用補充說明:

 在一個系統中,後續會有一些邊緣需求,比如:

1、加強安全校驗;

2、方法呼叫次數的統計;

3、請求紀錄檔的記錄

4、......

都可以在全域性方法中自由發揮,比如在方法結束後:

收集請求引數或處理結果,放置到全域性佇列中,開個執行緒在全域性定時掃描處理等。

總結:

DefaultController的名字是約定好的,用處也比較實在,一般專案都會用到它。

具體各方法的執行順序,可以看該方法上的註釋。

下一篇介紹:業務邏輯基礎類別LogicBase的使用,還有兩篇,將轉入微服務系列教學。