• Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。


    系列目录

    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的味道。

    全局控制器的完整方法与注释说明:

    复制代码
    /// 
        /// 全局控制器(适全全局事件处理)
        /// 
        public class DefaultController : Taurus.Core.Controller
        {
            /// 
            /// 所有寻址不到的请求都集中执行到此方法(不想接收404则删除此重载方法即可)。
            /// 
            public override void Default()
            {
                Write("DefaultController : Hello world");
            }
            /// 
            /// 用于所有的请求合法性验证,配合[Ack]属性
            /// 启用时:局部的先执行(若存在),无局部才执行全局。
            /// 
            public static bool CheckAck(IController controller, string methodName)
            {
                //需要自己实现Ack验证
                return !string.IsNullOrEmpty(controller.Query<string>("ack"));
    
            }
    
            /// 
            /// 用于需要登陆后的身份验证,配合[Token]属性
            /// 启用时:局部的先执行(若存在),无局部才执行全局。
            /// 
            public static bool CheckToken(IController controller, string methodName)
            {
                //需要自己实现,或者通过配置Taurus.Auth启动自带的验证(自带的注释掉此方法即可)。
                return !string.IsNullOrEmpty(controller.Query<string>("token"));
            }
    
            /// 
            /// 用于校验微服务的内部身份验证,配合[MicroService]属性
            /// 启用时:全局仅此一个生效,局部的失效。
            /// 
            public static bool CheckMicroService(IController controller, string methodName)
            {
                return MicroService.Config.ServerKey == controller.Query(MicroService.Const.HeaderKey);
            }
    
            /// 
            /// 全局【路由映射】
            /// 启用时:所有请求都进入此地做映射(需要映射时,返回映射的地址;不需要映射的返回空即可)。
            /// 
            public static string RouteMapInvoke(HttpRequest request)
            {
                //if (request.Url.LocalPath.StartsWith("/api/") && RouteConfig.RouteMode == 2)
                //{
                 //   return "/test" + request.RawUrl;
                //}
                return string.Empty;
            }
            /// 
            /// 全局【方法执行前拦截】
            /// 启用时:先全局,再执行局部(若存在)。
            /// 
            public static bool BeforeInvoke(IController controller, string methodName)
            {
                return true;
            }
            /// 
            /// 全局【方法执行后业务】
            /// 启用时:先执行局部(若存在),再执行全局。
            /// 
            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的使用,还有两篇,将转入微服务系列教程。

  • 相关阅读:
    如何理解MVCC
    【2023】redis-stream配合spring的data-redis详细使用(包括广播和组接收)
    341.扁平化嵌套列表迭代器 | N叉树的最大深度
    计算机毕业设计Java在线问诊系统的设计与实现(源码+系统+mysql数据库+Lw文档)
    游戏开发37课 狙击枪 视野问题
    前端 - Map对象详解
    第 04 章_逻辑架构
    [UDS] --- DiagnosticSessionControl 0x10 service
    RePaint: Inpainting using Denoising Diffusion Probabilistic Models 论文解读和感想
    C:sprintf和snprintf的陷阱
  • 原文地址:https://www.cnblogs.com/cyq1162/p/16532335.html