v4.8.6
版本说明
发布 Furion
和 Furion.Tools
和 Furion.Xunit
v4.8.6
版本,包含动态 WebAPI
,粘土对象等诸多改进。
本期更新
-
新特性
- [新增] 粘土对象支持任何字符作为
JSON/XML
键 4.8.6.9 ⏱️2023.02.19 #note_16329657 - [新增] 动态
WebAPI
自动检查路由是否包含重复参数,如果有自动修正而不是抛异常 4.8.6.5 ⏱️2023.02.17 5f15ea1 - [新增]
byte[]
类型MD5
加密/比较重载方法 4.8.6.3 ⏱️2023.02.15 #I6F1NT - [新增] 动态
WebAPI
支持[RouteConstraint(":*")]
路由约束 4.8.6.2 ⏱️2023.02.10 #I6E6JA - [新增]
Swagger
启用登录后配置CheckUrl
可获取本地存储的Authorization
请求报文头 4.8.6.2 ⏱️2023.02.10 #I6E3LB - [新增] 多语言支持
.json
文件配置方式(推荐) 4.8.6 ⏱️2023.02.08 #I6DL71 #I5DXKP - [新增] 定时任务
IScheduler.[Try]UpdateDetail(builder => {})
和IScheduler.[Try]UpdateTrigger(triggerId, builder => {})
重载方法 4.8.6 ⏱️2023.02.08 6e43a54
- [新增] 粘土对象支持任何字符作为
-
突破性变化
-
问题修复
- [修复]
Serve.Run()
因 #I6G02W 更改导致不配置端口时出现异常无法启动问题 4.8.6.10 ⏱️2023.02.20 #I6G6AR - [修复] 粘土对象不支持
数字
作为JSON/XML
键问题 4.8.6.9 ⏱️2023.02.19 #note_16329657 - [修复] 动态
WebAPI
不支持嵌套继承[Route]
特性问题 4.8.6.8 ⏱️2023.02.18 #I6CLPT - [修复]
Serve.Run(urls: "端口")
设置端口在.NET6/7
下发布后始终是80
端口问题 4.8.6.6 ⏱️2023.02.18 #I6G02W - [修复] 粘土对象不支持
中文
作为JSON/XML
键问题 4.8.6.6 ⏱️2023.02.18 4961e01 - [修复] 远程请求代理模式配置了
WithEncodeUrl = false
无效问题 4.8.6.4 ⏱️2023.02.16 89639ba - [修复] 动态
WebAPI
自定义[HttpMethod(template)]
之后生成错误路由 4.8.6.1 ⏱️2023.02.08 59fe53b
- [修复]
-
其他更改
-
文档
- [新增] 多语言
.json
配置方式文档 - [更新] 日志文档、定时任务文档、动态
WebAPI
文档,规范化结果文档,App
静态类文档,Oops
静态类文档、虚拟文件系统文档 !704,远程请求文档,序列化文档、入门文档、脱敏模块文档
- [新增] 多语言
-
贡献者
- Andy (@man119)
- liuhll (@liuhll2)
- 大柚 (@big-pomelo)
- WR_YT (@wr-yt)
本期亮点
1. 新增定时任务更新作业信息和作业触发器方法
- 更新作业信息
// 返回 ScheduleResult 类型
var scheduleResult = Scheduler.TryUpdateDetail(jobBuilder =>
{
jobBuilder.SetDescription("~~~");
}, out var jobDetail);
// 无返回值
scheduler.UpdateDetail(jobBuilder =>
{
jobBuilder.SetDescription("~~~");
});
- 更新作业触发器
// 返回 ScheduleResult 类型
var scheduleResult = scheduler.TryUpdateTrigger("triggerId", triggerBuilder =>
{
triggerBuilder.SetDescription("~~");
}, out var trigger);
// 无返回值
scheduler.UpdateTrigger("triggerId", triggerBuilder =>
{
triggerBuilder.SetDescription("~~");
});
2. 新增多语言 .json
文件配置支持
https://furion.baiqian.ltd/docs/local-language#2111-基于-json-文件多语言
L.Text["Furion"]; // => 如果设置为英文,但是没有文件,则直接输出 “Furion”
3. 动态 WebAPI
路由规则小调整
在过去,TestMethod
生成路由为:/mytest
// 注意这里没有 [Route] 特性
public class ClassService: IDynamicApiController
{
[HttpPost("mytest")]
public void TestMethod()
{
}
}
新版本:TestMethod
生成路由为:/api/class/mytest
,TestMethod2
生成路由为:/mytest
。
// 注意这里没有 [Route] 特性
public class ClassService: IDynamicApiController
{
[HttpPost("mytest")]
public void TestMethod()
{
}
[HttpPost("/mytest")]
public void TestMethod2()
{
}
}
也就是新版本如果不需要自动添加前缀,需在前面添加 /
,旧版本不需要。
4. 动态 WebAPI
路由约束 [RouteConstraint(":*")]
支持
public class TestService: DynamicApiController
{
// 生成的路由为:/api/test/catch-all1/{*path}
[HttpGet]
public string CatchAll1([RouteConstraint(":*")] string path)
{
return path;
}
// 生成的路由为:/api/test/aaa/bbb/ccc/{*path}
[HttpGet("aaa/bbb/ccc")]
public string CatchAll2([RouteConstraint(":*")] string path)
{
return path;
}
// 生成的路由为:/aaa/bbb/ccc/{*path}
[HttpGet("/aaa/bbb/ccc/{*path}")]
public string CatchAll3(string path)
{
return path;
}
}
5. 新增 MD5
加密支持 byte[]
类型参数
// Furion 4.8.6.3+ 版本支持 byte[] 类型,如获取文件 MD5 Hash
var bytes = File.ReadAllBytes("image.png");
var md5Hash = MD5Encryption.Encrypt(bytes); // 加密
var isEqual = MD5Encryption.Compare(bytes, md5Hash); // 比较
6. 支持路由模板带重复参数
public class WithClass : IDynamicApiController
{
[HttpGet("system/role/deptTree/{roleId}")] // 过去版本抛异常,Furion 4.8.6.5+ 正常~
public string GetResult2(string roleId)
{
return nameof(Furion);
}
}
过去版本会抛异常,新版本不会。
7. 粘土对象支持任何字符作为键
// 数字作为键
var str = "{\"data\": {\r\n \"16347413030322\": {\r\n \"componentType\": \"@ali/tdmod-od-pc-offer-discount\",\r\n \"trackInfo\": {},\r\n \"data\": {\r\n \"couponList\": [{ \"couponType\": \"CARD\", \"couponContent\": \"1件混批\" }],\r\n \"pageName\": \"Page_GetCoupon\"\r\n }\r\n }\r\n }\r\n}";
var a = Clay.Parse(str);
var a1 = a["data"]["16347413030322"]["componentType"];
Console.WriteLine(a1);
// 中文作为键
var str1 = "{\"data\": {\r\n \"中文\": {\r\n \"componentType\": \"@ali/tdmod-od-pc-offer-discount\",\r\n \"trackInfo\": {},\r\n \"data\": {\r\n \"couponList\": [{ \"couponType\": \"CARD\", \"couponContent\": \"1件混批\" }],\r\n \"pageName\": \"Page_GetCoupon\"\r\n }\r\n }\r\n }\r\n}";
var b = Clay.Parse(str1);
var b1 = b["data"]["中文"]["componentType"];
Console.WriteLine(b1);
// 符号作为键
var str2 = "{\"data\": {\r\n \"~\": {\r\n \"componentType\": \"@ali/tdmod-od-pc-offer-discount\",\r\n \"trackInfo\": {},\r\n \"data\": {\r\n \"couponList\": [{ \"couponType\": \"CARD\", \"couponContent\": \"1件混批\" }],\r\n \"pageName\": \"Page_GetCoupon\"\r\n }\r\n }\r\n }\r\n}";
var c = Clay.Parse(str2);
var c1 = c["data"]["~"]["componentType"];
Console.WriteLine(c1);
// 大杂烩作为键
var str3 = "{\"data\": {\r\n \"^123,中文~,!\": {\r\n \"componentType\": \"@ali/tdmod-od-pc-offer-discount\",\r\n \"trackInfo\": {},\r\n \"data\": {\r\n \"couponList\": [{ \"couponType\": \"CARD\", \"couponContent\": \"1件混批\" }],\r\n \"pageName\": \"Page_GetCoupon\"\r\n }\r\n }\r\n }\r\n}";
var d = Clay.Parse(str3);
var d1 = c["data"]["^123,中文~,!"]["componentType"];
Console.WriteLine(d1);