第五篇 基于.net搭建热插拔式web框架(拦截器---请求管道)

摘要:
=空匹配项。长度˃0){int_index=0;result=newUrlPathEntity();result.controller=string.Empty;//{result.control+=“.”+匹配[index++];}结果的控制器名称。控制器=结果。控制器。基底;result.action=匹配[index];//操作名称}}returnresult;}获取转换后的对象:varurlEntity=HuberPluginHandle。getUrlPathEntity;根据对象查找相应的沙盒:SandBoxDynamicLoadersandBox=HuberPluginHandle。获取SandBox;然后,我们打包请求中携带的参数:RefRequestEntityparas=newRefRequestEntity();RequestHandle.FillCorRefEntity;好了,准备工作准备就绪。最后一步是调用沙盒:varresult=sandbox。调用方法;这个结果就是我们想要的结果。我们接下来需要做的是将此结果返回到RequestHandle。ReposeResult;到目前为止,我们的定制请求管道已经完成。为了防止整个代码引起的反感,省略了许多辅助服务。我希望你能理解。

  好了,前边我们把核心内容介绍完了,接下来要做的就是拦截用户的请求,并把请求转向沙箱内。

  这里我们准备通过实现一个HttpModule类来完成请求的拦截与转发。新建一个HuberHttpModule类,并继承IHttpModule。下面我们暂时只处理Application_BeginRequest事件。

  先获取request和response对象

    HttpApplication application = sender as HttpApplication;
    HttpResponse respond = application.Response;
    HttpRequest request = application.Request;        

  接下来获取当前请求的url:

string url = request.Url.AbsolutePath.ToString();

  我们做了一个约定,所有模块都放在plugins目录中,即需要判断一下当前url是否以“/plugins/”开头,再判断一下是否为静态文件(通常情况下,我们的action命名是不允许包含“.”的)。

  接下来定义一个UrlPathEntity类,把url转换成UrlPathEntity的实例对象,用来存放url对应的插件名称、插件版本、controller、action。

  

    public class UrlPathEntity
    {
        /// <summary>
        /// //插件名称
        /// </summary>  
        public string pluginname { get; set; }
        /// <summary>
        /// //插件版本
        /// </summary>  
        public int pluginversion { get; set; }
        /// <summary>
        /// //控制器名称(包含area)
        /// </summary>   
        public string controller { get; set; }
        /// <summary>
        /// //action名称
        /// </summary>
        public string action { get; set; }
    }

  下面是url转换方法:  

/// <summary>url解析成对象
        /// </summary>
        /// <param name="url"></param>
        /// <param name="isPlugin">是否为插件</param>
        /// <returns></returns>
        public static UrlPathEntity getUrlPathEntity(string url, bool isPlugin)
        {
            UrlPathEntity result = null;
            var matchs = url.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
            if (isPlugin)
            {
                //var matchs = PluginRgx.Matches(url);
                if (matchs != null && matchs.Length > 0)
                {
                    int _index = 0;
                    result = new UrlPathEntity();
                    result.pluginname = matchs[_index++];//插件名称
                    string _pluginversion = matchs[_index++];//插件版本
                    int pluginversion = -1;
                    int.TryParse(_pluginversion, out pluginversion);
                    result.pluginversion = pluginversion;
                    string urltemp = "/" + result.pluginname;
                    for (; _index < matchs.Length - 1;)
                    {
                        urltemp += "/" + matchs[_index++];
                    }
                    result.action = matchs[_index];//action名称
                    urltemp += "/" + result.action;

                    CAModel controller = null;//控制器名称(包含area)
                    UrlRefAction.TryGetValue(urltemp.ToLower(), out controller);
                    if (controller != null)
                    {
                        result.controller = controller.ControllerName.Replace("/", ".");
                        result.action = controller.ActionName;
                    }
                }
            }
            else
            {
                if (matchs != null && matchs.Length > 0)
                {
                    int _index = 0;
                    result = new UrlPathEntity();
                    result.controller = string.Empty;//控制器名称(包含area)
                    for (; _index < matchs.Length - 1;)
                    {
                        result.controller += "." + matchs[_index++];
                    }
                    result.controller = result.controller.Substring(1);
                    result.action = matchs[_index];//action名称
                }
            }
            return result;
        }

  获取转换后的对象:

var urlEntity = HuberPluginHandle.getUrlPathEntity(url.Substring(8), true);

  根据该对象找到对应的沙箱:

 SandBoxDynamicLoader sandBox = HuberPluginHandle.getSandBox(urlEntity.pluginname, urlEntity.pluginversion);

  我们再把请求中携带的参数打包:

RefRequestEntity paras = new RefRequestEntity(); 
RequestHandle.FillCorRefEntity(paras, request);

  好了,准备工作做好了,最后一步,沙箱调用:  

 var result = sandBox.InvokeMothod(urlEntity.controller, urlEntity.action, paras);

  这个result就是我们想要的结果了,接下来我们要做的就是把这个result返回了

RequestHandle.ResposeResult(respond, result);

  至此,我们自定义的请求管道就算完成了,这其中为了防止通篇代码带来的反感,就省略了好多辅助业务,希望大家谅解。

 本来还想把权限管理什么的些进来,后来想了想,这个系列主要是讲框架的原理,而且权限那块是基于sqlite写的,不具有规模并发能力,代码已经开源出来了,地址:https://github.com/Eric-zsp/Huber.net

这个系列暂时先写到这里吧。

转载请注明出处:http://www.cnblogs.com/eric-z/p/5108862.html 

免责声明:文章转载自《第五篇 基于.net搭建热插拔式web框架(拦截器---请求管道)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇processing基本图形绘制logstash开机启动下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java爬虫(四)利用Jsoup获取需要登陆的网站中的内容(无验证码的登录)

一、实现原理 登录之后进行数据分析,精确抓取数据。根据上篇文章的代码,我们不仅获取了cookies,还获取了登录之后返回的网页源码,此时有如下几种种情况:(1)若我们所需的数据就在登录之后返回的源码里面,那么我们就可以直接通过Jsoup去解析源码了,然后利用Jsoup的选择器功能去筛选出我们需要的信息;(2)若需要的数据是需要通过请求源码里的链接得到,那么...

php访问url的四种方式

1.fopen方式//访问指定URL函数 functionaccess_url($url){ if($url=='')returnfalse; $fp=fopen($url,'r')orexit('Openurlfaild!'); if($fp){ while(!feof($fp)){ $file.=fgets($fp).""; } fclose($f...

js Jquery字符UrlEncode 编码 C#(asp.net)解码 Server HttpUtility 区别 cookies存中文

一、Js asp.net 交互Url编码解码 C#(asp.net)编码:HttpUtility.UrlEncode(url) Jquery解码:decodeURIComponent(url); Jquery编码:encodeURIComponent(url); C#(asp.net)解码:HttpUtility.UrlDecode 二、asp.net(S...

Python学习第118天(Django回头看:MVCMTV、Django初步、static、url命名、分区)

今天开始重新复习,内容看的也更连贯一些,下面开始内容复述,先说一下MTV和MVC的问题 MVC(modles views controller)即web应用模型,可以指代各种各样的模型 modles即为模型 views 视图,特指用户看到的html文件 controller控制器 MTV(modles template views)即为Django模型,...

sqlmap 绕过WAF

1、基本的语法 sqlmap 更新  sqlmap -update 具体的使用方法: sqlmap -u url --current-user sqlmap -u url --current-db sqlmap -u url --tables -D "db_name" sqlmap -u url --columns -T "tablename" users...

Gradle在Mac上安装及Idea中配置

前言 笔者在安装Gradle的过程中发现过程有点繁琐且安装教程比较少,因此记录一下安装过程,方便同行参考 环境信息 macOS:10.15.5IntelliJ IDEA:2020.3Gradle:6.8.2Java:1.8.0_151Homebrew: 3.0.1 进入Gradle官网 点此进入Gradle官网 点击安装 安装文档 包管理安装 安装b...