WebApi多版本管控和插件式开发(二)——WebApi多版本管控

3 篇文章 0 订阅

在面向服务开发的时代,WebApi使 .Net 的接口开发脱离IIS束缚,更加灵活,轻量,下面我们逐步实现 WebApi的多版本管控,和插件式开发

实现功能:

  1. 通过搭建Windows服务构造WebApi站点
  2. 透过 http://*/api/v1/controller 的方式访问对应版本的 API
  3. 插件式开发,将写好接口的dll放置在站点指定文件夹中,就可以对外提供dll中的Api

以下是逐步实现的过程

 

二、实现多版本管控

1.重写DefaultHttpControllerSelector类

在项目中创建一个类 VersionnControllerSelector继承DefaultHttpControllerSelector进行方法重写

直接贴代码

using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Dispatcher;

namespace WebApiService
{
    public class VersionnControllerSelector : DefaultHttpControllerSelector
    {
        public HttpConfiguration _config;
        public VersionnControllerSelector(HttpConfiguration config)
        : base(config)
        {
            _config = config;
        }
        public override IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
        {
            Dictionary<string, HttpControllerDescriptor> dic = new Dictionary<string, HttpControllerDescriptor>();
            foreach (var ams in _config.Services.GetAssembliesResolver().GetAssemblies())
            {
                // 获取继承自 ApiControl 的非抽象类
                var controlTypes = ams.GetTypes().Where(p => !p.IsAbstract && typeof(ApiController).IsAssignableFrom(p)).ToArray();
                foreach (var ctrlType in controlTypes)
                {
                    // 从 namespace 中提取出版本号
                    var match = Regex.Match(ctrlType.Namespace,
                    @"\w+.Controller.(V\d+)", RegexOptions.IgnoreCase);
                    if (match.Success)
                    {
                        string verNum = match.Groups[1].Value;// 获取版本号
                        string ctrlName =
                        Regex.Match(ctrlType.Name, @"(\w+)Controller").Groups[1].Value;// 从 LoginController 中拿到 Login
                        string key = verNum + "/" + ctrlName;//Personv2 为 key
                        dic[key.ToUpper()] = new HttpControllerDescriptor(_config, ctrlName, ctrlType);
                    }
                    else
                    {
                        string ctrlName =
                        Regex.Match(ctrlType.Name, @"(\w+)Controller").Groups[1].Value;// 从 LoginController 中拿到 Login
                        string key = ctrlName;//Personv2 为 key
                        dic[key.ToUpper()] = new HttpControllerDescriptor(_config, ctrlName, ctrlType);
                    }
                }
            }
            return dic;
        }

        public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            // 获取所有 Controller 集合
            var controllers = GetControllerMapping();
            // 获取路由数据
            var routeData = request.GetRouteData();
            // 从 url 中获取到版本号
            string verNum =
            Regex.Match(request.RequestUri.PathAndQuery, @"api/([\w/]+)", RegexOptions.IgnoreCase).Groups[1].Value;

            if (controllers.ContainsKey(verNum.ToUpper()))// 获取 HttpControllerDescriptor
            {
                return controllers[verNum.ToUpper()];
            }
            else
            {
                return null;
                //return base.SelectController(request);
            }
        }
    }
}

注释里边写的都挺全的

本段代码参考文章:https://www.imooc.com/article/37970

2.修改启动类

using Microsoft.Owin;
using Owin;
using System.Web.Http;
using System.Web.Http.Dispatcher;

[assembly: OwinStartup(typeof(WebApiService.Startup))]

namespace WebApiService
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
            var config = new HttpConfiguration();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
                );
            //config.Services.Replace(typeof(IAssembliesResolver), new PluginsResolver());//此处是插件式开发的 配置,在此时还未实现先注释
            config.Services.Replace(typeof(IHttpControllerSelector), new VersionnControllerSelector(config));//此处是多版本管控的配置,在此时还未实现先注释
            app.UseWebApi(config);
        }
    }
}

ok,下边我们测试一下

先创建两个新版本的接口

接口代码分别为

using System.Web.Http;

namespace WebApiService.Controller.V1
{
    public class GetVerController : ApiController
    {
        public string GetVer()
        {
            return "This V1 Api!";
        }
    }
}

using System.Web.Http;

namespace WebApiService.Controller.V2
{
    public class GetVerController : ApiController
    {
        public string GetVer()
        {
            return "This V2 Api!";
        }
    }
}

我们修改一下入口代码

using System;
using Microsoft.Owin.Hosting;
using System.ServiceProcess;

namespace WebApiService
{
    class Program
    {
        static void Main(string[] args)
        {
            //启动服务使用该段代码
            //ServiceBase[] ServicesToRun;
            //ServicesToRun = new ServiceBase[]
            //{
            //    new WebApiService () //此处是我们的windows服务类名称
            //};
            //ServiceBase.Run(ServicesToRun);

            //调试使用该段代码
            WebApp.Start<Startup>("http://127.0.0.1:8088");
            Console.WriteLine("Service Started!");
            Console.Read();
        }
    }
}

启动项目

我们测试一下接口 http://127.0.0.1:8088/Api/GetData  返回 Hello Word!

                              http://127.0.0.1:8088/Api/V1/GetVer 返回 This V1 Api!

                              http://127.0.0.1:8088/Api/V2/GetVer 返回 This V2 Api!

好的,到现在,我们的多版本管控就完成了

下一篇,插件式开发将配合版本管控达到神奇的效果

 

附录

WebApi多版本管控和插件式开发(一)——WebApi服务搭建

WebApi多版本管控和插件式开发(二)——WebApi多版本管控

WebApi多版本管控和插件式开发(三)——WebApi插件式开发

附上源码:https://download.csdn.net/download/xy596356456/12864960

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
新秀WebApi接口主要用于其他内嵌api接口的软件、web、app程序进行整合开发使用。 新秀WebApi接口主要功能 1、 可以通过本接口,开发更加强大网络应用软件,快速的调用会员数据、信息数据,与discuz系统无缝整合调用; 2、 充分使用discuz原有的会员框架系统,将会员的注册信息、积分等一系列信息进行外部调用及操作,可使用本接口做一个简单的网络验证系统及软件登录的框架,而不用重新再设计,与discuz系统同步更新、使用; 3、 充分利用discuz原有的信息框架系统,例如门户、论坛、群组、空间等系统进行数据的调用、修改、发布,实现传统web网站与手机app、桌面应用软件互通互联,同步更新; 4、 通过discuz框架,编写的api接口,严格遵循官方安全过滤要求,极大的提高安全性,有力的遏制注入风险; 5、 本接口通过通用的GET、POST数据提交方与本插件进行数据库交互,采用国际通过的json格进行输出,这也是针对其他软件开发工具所常备的内置json解析功能,更加的快捷、安全的开发产品; 6、 本插件内置三个传输密钥,可根据不同分工和任务进行分发,取消一个传输密钥,不影响其他人继续开发使用; 7、 本插件对传入参数都进行了入口过滤,对参数不齐、方法不对都将在入口层进行阻止返回,有效的避免了将错误信息传送后直接对数据库操作,产生的不可逆问题; 8、 本插件后期将继续开发,更强大的数据库操作功能接口,并增加自定义功能,让管理员根据自身需求,自己开发api接口,发挥软件的最大效能; 新秀WebApi接口截图 相关阅读 同类推荐:站长常用源码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值