Beetlex服务框架之Webapi版本访问控制
在应用服务中API更新是很普遍的事情,为了服务良好地运作很多时候需要新旧版本同时兼容;为了应对这一系列的需求FastHttpApi在新版中强化了Url重写机制来支持API访问版本控制,由原来固定的重写规则调整成支持动态数据的重写规则,主要支持域名,header和querystring等不同值进一个重写的定义。接下来讲解如何通过FastHttpApi来控制不同版本的API访问
API示例
[Controller(BaseUrl = "Api")]
public class Api
{
public object Hello(string name)
{
return $"hello {name} at {DateTime.Now}";
}
}
[Controller(BaseUrl = "Api/v2")]
public class ApiV2
{
public object Hello(string name)
{
return $"hello {name} at {DateTime.Now}[v2]";
}
}
以上是两个不同版本的API功能,访问的Url分别是/Api/hello和/Api/v2/hello

其实有很多时候希望不改变Url路径的情况来对不同版本来进行一访问,这样在使用调整上就比较方便简单。FastHttpApi支持通过域名,请求头和请求参数来应对不同情况的重写,这样就可以让调用者无法关注访问的路径统一设置相关参数即可。
依据域名重写
组件支持依据域名来重写Url,针对这情况可以定义一个V2.beetlex.com来访问/Api/v2/hello,在程序启动的时候加入一个重写
static void Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.UseBeetlexHttp(o =>
{
o.AddFilter<DefaultJsonResultFilter>();
o.LogToConsole = true;
o.Port = ;
o.SetDebug();
o.LogLevel = BeetleX.EventArgs.LogType.Info;
},
b =>
{
b.UrlRewrite
.Add("v2.beetlex.com", "/api/{action}", "/api/v2/{action}");
},
typeof(Program).Assembly);
});
builder.Build().Run();
}
只要是通过V2.beetlex.com访问的/api/{action}重写到/api/v2/{action},重写后访问的结果如下:

一般情况很少会用域名来区分,用域名区分的场更多是正式和测试API的兼容部署,测试完成后会替换原则有的API;后面会讲述如何接管旧的请求到新的版本中。
依据Header或QueryString值来重写
其实在Header中添加则是对整个Url是没有任何影响的,组件可以这样定义这个重写规则
static void Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.UseBeetlexHttp(o =>
{
o.AddFilter<DefaultJsonResultFilter>();
o.LogToConsole = true;
o.Port = ;
o.SetDebug();
o.LogLevel = BeetleX.EventArgs.LogType.Info;
},
b =>
{
b.UrlRewrite
.Add("version=v2", "/api/{action}", "/api/v2/{action}")
},
typeof(Program).Assembly);
});
builder.Build().Run();
}
以上是配置一个version变量,只要这个变量是等于v2的情况则会触发这个重写规则;组件会先从请求头中获取,获取不了的情况再从Url请求数据中获取。使用效果如下:

由于浏览器不方便添加header,通过Postman添加版本头来测试

版本替换
如果服务是一个新旧版本替换的情况下则可以重写Url,把访问旧的api路径指向新的api路径。
static void Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.UseBeetlexHttp(o =>
{
o.AddFilter<DefaultJsonResultFilter>();
o.LogToConsole = true;
o.Port = ;
o.SetDebug();
o.LogLevel = BeetleX.EventArgs.LogType.Info;
},
b =>
{
b.UrlRewrite
.Add("/api/{action}", "/api/v2/{action}");
},
typeof(Program).Assembly);
});
builder.Build().Run();
}

提醒
其实组件UrlRewrite是支持运行时动态更新,只需要做个管理页即可随时调整API不同版本的访问处理。
了解更多框架webapi功能可以访问https://github.com/IKende/FastHttpApi/wiki
Beetlex服务框架之Webapi版本访问控制的更多相关文章
- Beetlex服务框架之Webapi访问限制和url重写
在新版本的BeetleX.FastHttpApi中集成了IP访问策略和URL重写两个功能,通过IP访问策略可以制定服务针对不同IP的访问限制控制:而URL重写则可以制定更好的URL访问方式.以下介绍这 ...
- 昇思MindSpore全场景AI框架 1.6版本,更高的开发效率,更好地服务开发者
摘要:本文带大家快速浏览昇思MindSpore全场景AI框架1.6版本的关键特性. 全新的昇思MindSpore全场景AI框架1.6版本已发布,此版本中昇思MindSpore全场景AI框架易用性不断改 ...
- 让techempower帮你通讯服务框架的性能
在编写服务应用框架的时候一般都需要进行性能测试,但自己测试毕竟资源受限所以很难做更高性能上的测试.其实GitHub上有一个项目可以让开发人员提交自己的框架服务代码然后进行一个标准测试:现在已经有上百个 ...
- 阿里巴巴分布式服务框架Dubbo介绍(1)主要特色
引言 互联网服务和BS架构的传统企业软件相比,系统规模上产生了量级的差距.例如 传统BS企业内部门户只需要考虑数百人以及几千人的访问压力,而大型互联网服务有时需要考虑的是千万甚至上亿的用户: 传统企业 ...
- Spring-boot:快速搭建微服务框架
前言: Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置. 简单来说,它提供了一堆依赖打包,并 ...
- NetCore使用Jwtbearer给WebAPI添加访问控制
原文:NetCore使用Jwtbearer给WebAPI添加访问控制 现在JWT代替session来做访问控制已经成为大部分webapi的做法,今天我们也来尝试一下 WebAPI使用NetCore2. ...
- 基于netty轻量的高性能分布式RPC服务框架forest<上篇>
工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...
- 分布式服务框架 dubbo/dubbox 入门示例
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- 用Asp.net写自己的服务框架
阅读目录 开始 理解Asp.net管线 HttpHandler HttpModule 关于Content-Encoding的解释 选 HttpHandler 还是 HttpModule ? 看不见的性 ...
随机推荐
- 用 C# 来守护 Python 进程
背景 目前我主要负责的一个项目是一个 C/S 架构的客户端开发,前端主要是通过 WPF 相关技术来实现,后端是通过 Python 来实现,前后端的数据通信则是通过 MQ 的方式来进行处理.由于 Pyt ...
- 主动降噪技术(ANC)的前生今世--原理仿真
一 原理: 主动降噪就是通过反相检测麦克风的声音或噪声来减弱周围环境的噪声让扬声器出来的声音听起来更清晰.主动降噪技术的目标就是通过一个自适应滤波器把不想要的噪声反相从而把噪声约束到固定的范围内.该系 ...
- Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】
一.Web框架概述 Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...
- Hibernate 中setResultTransformer使用
在使用hibernate框架,查询数据库多张表或者单张表的某几个需要的字段数据时,往往只能通过sql语句配合setResultTransformer将查询到的数据封装到一个map集合中,再将map集合 ...
- Win10 安装配置 MongoDB 4.0 踩坑记
redis 官方没有 Windows 版的,微软维护的已经好久没更新了,所以就在想着换成 MongoDB. 于是一趟被我复杂化的踩坑之旅就开始了,同时也记录一下,避免有人遇见跟我一样的问题. 首先在 ...
- Future类型的连锁的运用
Future类型的连锁的运用: 洗脸 刷牙 吃早饭 看电视 出门 串行: import scala.concurrent.{Await, Future} import scala.util.{Fail ...
- Spark 学习笔记之 MONGODB SPARK CONNECTOR 插入性能测试
MONGODB SPARK CONNECTOR 测试数据量: 测试结果: 116万数据通过4个表的join,从SQL Server查出,耗时1分多.MongoSparkConnector插入平均耗时: ...
- 小程序webview跳转页面后没有返回按钮完美解决方案
随着小程序越来越火爆,使一个产品如果只有公众号H5页面和APP显得不怎么完美,总感觉不搭上小程序这趟流量车,就会少了点什么,心里别扭地很.在此驱动下,我所在公司也决定赶紧上车. 但是,如果要按照小程序 ...
- Linux下格式化恢复USB启动优盘
问题描述:优盘制作成启动盘安装操作系统,但是后边使用时发现无法格式化,提示 This partition cannot be modified because it contains a partit ...
- 关于javascript中的prototype
作为一个致力于前端开发的人员,能够熟练掌握javascript的原理和机制是每个小白的必经之路,这也是最痛苦的.有人说前端功力好不好最主要的就是看对js的掌握能力,有人说十年也啃不完一门javascr ...