Skip to main content

v3 版本(归档) - 更新日志

Furion 框架升级/发版规则

升级前重点关注可能造成【破坏性】的标签类型

版本号规则:主版本号.次版本号.修订版本号.迭代版本号

  • 只要【确认】为框架 bug,则当天修复,当天发版,修订版本号 加 1
  • 只要 .NET SDK 版本更新,则当天升级,当天发版,修订版本号 加 1
  • 如果 .csproj 文件有变更,则当天发版,修订版本号 加 1
  • 如果新增 扩展包,为了版本号统一,则当天发版,修订版本号 加 1
  • 如果涉及到代码重构,则当天发版,次版本号 加 1,修订版本号 清 0
  • 如果 .NET SDK 主版本号升级,则当天发版,主版本号 加 1

如有意外不能当天发版,则会在 Issue 中说明具体发版时间,正常不会超过 3 天。

dotNET China/Furion

v3.9.2(已发布,全新日志组件)

关于日志

日志模块是任何应用系统都必备的功能,可以说是最重要的模块!在 .NET 社区中有 Log4NETNLogSerilog 等日志组件,它们无一不是优秀的开源项目。

但由于这些日志组件历史悠久,内部兼容的 .NET 版本非常多,功能随着时间推移变得极其强大复杂,在实际项目使用中,发现每一个日志组件配置总是不那么友好,特别是在使用上不够简单

Furion 作为全栈开发框架,在过去版本并没有提供足以满足开发者需求的日志模块,转而推荐大家集成第三方组件,如 Serilog导致后续无法实现自定义功能和也增加了不少维护成本。

这一次,Furion 不再妥协,彻底重构了日志模块,实现日志功能/需求完全自主可控,提供给开发者几乎所有日志功能的需求!

Furion 的使用者们,是时候“更换”掉第三方日志组件,让我们一起迭代出更强更好的日志组件吧! 🍖

  • 新特性
    •   日志模块,内置写入控制台、文件、数据库功能,再也无需引入第三方日志了!日志源码
    •   强大的调试日志 [LoggingMonitor] 32dfc1
  • 突破性变化
    •   日志模块,内置写入控制台、文件、数据库功能,再也无需引入第三方日志了!日志源码
    •   TP.Wrapper 规范化日志模板算法,由过去的 [属性] 改为 ##属性##,解决 JSON 内容冲突问题 394ecec
    •   未来 Furion.Extras.Logging.Serilog 扩展将不再继续维护,因为 Furion 有强大的日志组件了!
  • 问题修复
    •   脱敏模块模型绑定个别情况下空异常问题 #I5IM5C
  • 文档
    •   日志文档、静态类文档、数据校验文档
  • 本期亮点
  1. 极易使用且强大的日志模块
查看变化
// 写入文件
services.AddFileLogging("logs/application.log");

// 写入数据库
services.AddDatabaseLogging<DatabaseLoggingWriter>();

查看更多日志文档

  1. 强大的 [LoggingMonitor] 调试日志
查看变化
using Furion.Logging;

namespace Furion.Application;

public class TestLoggerServices : IDynamicApiController
{
[LoggingMonitor]
public PersonDto GetPerson(int id)
{
return new PersonDto
{
Id = id
};
}
}

支持控制器、操作或全局注册拦截

输出日志为:

┏━━━━━━━━━━━ Logging Monitor ━━━━━━━━━━━
┣ Furion.Application.TestLoggerServices.GetPerson (Furion.Application)

┣ 控制器名称: TestLoggerServices
┣ 操作名称: GetPerson
┣ 路由信息: [area]: ; [controller]: test-logger; [action]: person
┣ 请求地址: https://localhost:44316/api/test-logger/person/11
┣ 来源地址: https://localhost:44316/api/index.html
┣ 浏览器标识: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62
┣ 客户端 IP 地址: 0.0.0.1
┣ 服务端 IP 地址: 0.0.0.1
┣ 服务端运行环境: Development
┣ 执行耗时: 31ms
┣ ━━━━━━━━━━━━━━━ 授权信息 ━━━━━━━━━━━━━━━
┣ JWT Token: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEsIkFjY291bnQiOiJhZG1pbiIsImlhdCI6MTY1ODcxNjc5NywibmJmIjoxNjU4NzE2Nzk3LCJleHAiOjE2NTg3MTc5OTcsImlzcyI6ImRvdG5ldGNoaW5hIiwiYXVkIjoicG93ZXJieSBGdXJpb24ifQ.VYZkwwqCwlUy3aJjuL-og62I0rkxNQ96kSjEm3VgXtg

┣ UserId (integer): 1
┣ Account (string): admin
┣ iat (integer): 1658716797
┣ nbf (integer): 1658716797
┣ exp (integer): 1658717997
┣ iss (string): dotnetchina
┣ aud (string): powerby Furion
┣ ━━━━━━━━━━━━━━━ 参数列表 ━━━━━━━━━━━━━━━
┣ Content-Type:

┣ id (Int32): 11
┣ ━━━━━━━━━━━━━━━ 返回信息 ━━━━━━━━━━━━━━━
┣ 类型: Furion.Application.Persons.PersonDto
┣ 返回值: {"Id":11,"Name":null,"Age":0,"Address":null,"PhoneNumber":null,"QQ":null,"CreatedTime":"0001-01-01T00:00:00+00:00","Childrens":null,"Posts":null}
┗━━━━━━━━━━━ Logging Monitor ━━━━━━━━━━━

v3.8.9(已发布)

  • 新特性
    •   规范化结果 ExceptionMetadataValidationMetadata 都可以获取 ErrorCode 属性 #I5GJ6D
    •   ValidationMetadataStatusCode 属性 #I5HB5L
    •   远程请求对 Url 是否编码设置,[Get(WithEncodeUrl = false)]WithEncodeUrl(false) #I5GOBC
    •   更强大的 JWTEncryption.SecurityReadJwtToken('token') 读取解析 Token 静态方法 574eeb6
    •   ValiationTypes.Html 验证 Html 标签 #I5HBKC
    •   EFCore.NamingConventions 支持,可自定义生成表名,字段名风格,比如小驼峰,蛇形命名等 #I5HBEI
    •   INamedServiceProvider 命名服务提供器,可解析接口多实现 #I5HF98
    •   脱敏处理模块方法参数单个值处理 a22ec3c
    •   脱敏词库支持 | 分割词语 3106b1d
  • 突破性变化
    •   所有 .NET 依赖包至 6.0.7 版本
    •   Serilog.AspNetCore 包至 6.0.0 版本
    •   JWT Token 刷新逻辑 #I5GXML 574eeb6
    •   ExceptionMetadata 命名空间为 Furion.FriendlyException 3105d16
    •   Retry.Invoke(Func<Task>...) 为:Retry.InvokeAsync(Func<Task>...) 3b78999
    •   脱敏处理模块,大大提高性能和准确率,同时支持方法参数单个值处理 a22ec3c
  • 问题修复
    •   Rider 开发工具对同名脚手架 (EFCoreSqlSugar) 只显示一个问题 !518
    •   UnitOfWork 工作单元在 EFCore 中失效问题 #I5H0T3
    •   JWTToken 如果存在数组类型的值时,刷新 Token 后丢失了历史值 #I5GXML
    •   远程请求 WithEncodeUrl 无法在 [HttpMethod] 设置问题 574eeb6
    •   Serve.Run() 模式下添加自定义配置导致 EFCore 无法获取自定义配置文件问题 #I5GZ0F
    •   Oops.Bah 进入全局异常拦截器问题 #I5H47S
    •   AddDbPool/AddDb 扩展未根据配置 Key 路径读取问题 #I5H6S4 !520
    •   ValiationTypes.Url 正则表达式覆盖不全问题 #I5HBKC
    •   v3.5.x 版本导致集成 EFCore.NamingConventions 失效问题 #I5HBEI
    •   Swagger 长路由不支持问题以及 [Required] 配置 AllowEmptyStrings 无效问题 c014330
    •   远程请求上传文件时请求报文 boundaryContent-Disposition 设置不正确问题 #I5HEF0
    •   脱敏模块替换敏感词汇出现多替换问题 a22ec3c
  • 其他更改
    •   多语言默认处理逻辑,允许不配置任何语言,过去版本会报错 #I5GRD9 5077c5d
    •   规范化文档 Swagger 性能
    •   MongoDB 仓储 TDocument 泛型约束 3f49055
  • 文档
    •   远程请求文档,日志记录文档、多数据库文档、PM2 部署文档、Visual Studio 高效率文档

v3.7.11(已发布)

  • 新特性
    •   Minimal API 应用支持:.AddInjectMini() #I4KOQ5
    •   跨域 WithExposedHeaders 默认配置 access-tokenx-access-token 42ebdfd
    •   脚手架默认启用 app.UseHttpLogging() HTTP 日志 42ebdfd
    •   FurionASP.NET Core 完整 json 配置的 JSON Schema 架构 JSON Schema
    •   Sql 代理支持返回单个类类型参数 1d7fb5b
    •   Sql 代理支持返回 ValueTuple 单个类类型参数 876a2f5
    •   组件化设计模块,支持比 AppStartup 更灵活便捷的设计 #components
    •   独立工作单元模块,支持任何第三方 ORM a02413d
    •   跨域 FixedClientToken 配置参数 bd01638
    •   throw Oops.Bah 可以手动触发规范化验证失败处理 83f0036
    •   FriendlyExceptionSettingsThrowBah 配置,可标记 Oops.Oh 不进入异常处理 76ffa7f
  • 突破性变化
    •   Minimal API 应用支持:.AddInjectMini() #I4KOQ5
    •   FurionASP.NET Core 完整 json 配置的 JSON Schema 架构 JSON Schema
    •   组件化设计模块,支持比 AppStartup 更灵活便捷的设计 #components
    •   独立工作单元单元模块,支持任何第三方 ORM a02413d
    •   DataValidationFilterFriendlyExceptionFilter,解决不支持手动抛出业务异常问题 83f0036
    •   .AddDb<>.AddDbPool<> 自定义委托参数签名,由 Action<DbContextOptionsBuilder> 改为:Action<IServiceProvider, DbContextOptionsBuilder>
查看变化
// 由:
options.AddDbPool<TDbContext>(DbProvider.MySql, opt => {
});
// 改为
options.AddDbPool<TDbContext>(DbProvider.MySql, (services, opt)=> {
})
  • 问题修复
    •  v3.6.3 版本依赖,执行原生 Sql 添加了参数校验导致存储过程执行错误问题 #I5ERMQ
    •   tools/cli.ps1 脚本工具出现数据库链接被占用问题
    •   JWTSettings 算法配置 JSON Schema 错误问题,感谢 @gitwentao #I5G27B !516
    •   基于策略授权在不配置 Policy 的情况下出现空异常问题 #I5EVF2
    •   启用数据库实体跟踪时导致新增实体多次查询数据库问题 #I4J2LZ
    •   不启用规范化结果导致验证失效,异常失效问题 cdb3f57
    •   验证异常和友好异常冲突问题 83f0036
    •   CentOS 7.9 系统部署无法指定命令 --urls 参数问题 8cc8ee
  • 其他更改
    •   脚手架所有 .json 文件,默认添加 JSON Schema 支持
  • 文档
    •   组件化启动文档
    •   Vue/React/Angular 请求代理文档
    •   JSON Schema 文档,支持配置智能提示和验证
    •   跨域文档、规范化文档、配置文档、日志文档、IIS 部署文档
  • 本期亮点
  1. 新增 JSON Schema 支持,所有 .json 文件支持智能提示和验证
查看变化
{
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",

"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
},
"AllowedHosts": "*"
}

查看更多 JSON Schema 文档

  1. 根据 Swagger 生成 Vue/React/Angular 前端请求代码

查看文档

  1. Sql 代理支持返回单个类类型参数
查看变化
public interface ISql : ISqlDispatchProxy
{
// 集合类型
[SqlExecute("select * from person")]
List<Person> GetPersons();

// 自 v3.7.3+ 版本支持返回单个类类型参数
[SqlExecute("select * from person where id=@id")]
Person GetPerson(int id);
}
  1. Sql 代理支持返回 ValueTuple 单个类类型参数
查看变化
public interface ISql : ISqlDispatchProxy
{
[SqlExecute(@"
select * from person where id =@id;
select * from person")]
(Person, List<Person>) GetData(int id); // 注意返回值是 `(Person, List<Person>)` 组合
}
  1. 支持 Minimal API 应用
查看变化

了解 Minimal API 应用

var builder = WebApplication.CreateBuilder(args).Inject();

// 注册 Minimal 服务
builder.Services.AddInjectMini();

var app = builder.Build();

app.UseHttpsRedirection();

app.UseInject(string.Empty);

app.MapGet("/hello", () =>
{
return "Hello, Furion";
});

app.Run();

v3.6.9(已发布,全新入口组件)

关于入口组件

相信从 ASP.NET 5 升级至 ASP.NET 6 的开发者都经历过微软多次变更初始化主机 Program.csStartup.cs 写法,甚至在 .NET6+ 之后移除了 Startup.cs 的设计。

试问,ASP.NET 7ASP.NET 8... ASP.NET N 呢?会不会每一个版本都有不同的初始化方式,那后续项目如何无缝升级?

所以,为了保证一致的代码体验和后续无缝升级,推出了 Serve.Run(),即使未来创建方式变了,也不用担心,交给框架即可。

Serve.Run 模式也标记着 Furion 进入全新的极简入门时代。

  • 新特性
    •   Serve.Run() 极简主机模式,真正实现极速入门。95cac5b
    •   TP.Wrapper(...) 扩展方法,主要用来生成规范化的日志模板 427999a
    •   项目类型为 <Project Sdk="Microsoft.NET.Sdk"> 的控制台项目 fb08a65
    •   BadPageResult 错误页面类型 !494
    •   [SchemaId] 特性,解决不同程序集相同的类名生成 SwaggerSchemaId 冲突问题 #I5D3CU
    •   远程请求 options.ApproveAllCerts() 忽略所有客户端证书扩展 eb7d18a
    •   判断是否是单文件环境部署静态属性 App.SingleFileEnvironment de556f0
    •   WebApplicationBuilder.UseSerilogDefault() 扩展 e02524c
  • 突破性变化
    •   项目类型为 <Project Sdk="Microsoft.NET.Sdk"> 的控制台项目 fb08a65
    •   Serve.Run() 极简主机模式,真正实现极速入门。95cac5b
    •   未启用规范化结果时,MVC 验证失败返回 BadPageResult() 页面类型 !494
  • 问题修复
    •   默认注册的 services.AddResponseCaching(); 服务导致 .axd 内嵌资源请求错误问题 !495
    •   Oracle 数据库执行 sql 必须要求命令参数和 sql 语言参数数量一致 #I5D057
    •   IHostService 类型不能自动注册问题,之前只扫描了 BackgroundService 派生类 968344
    •   国产芯片主机不能识别 dotnet run --urls 参数问题 6d4398
    •   远程请求上传文件不支持特定文件后缀问题,如 .pem 文件 ba42198
    •   一些程序集已破坏或程序集不完整导致主机无法启动问题 d2dc3e4
    •   远程请求传入 headers 时类型为 Dictionary<string, string> 导致转换异常问题 #I5DHL9
    •   Serilog 单文件发布不生成日志文件 I5DQ2B
  • 其他更改
    •   远程请求默认客户端不检查 SSL 证书 eb7d18a
    •   开放验证服务选项 SuppressModelStateInvalidFilter 属性为可配置 !494
  • 文档
    •   Serve.Run() 文档
    •   HttpContext 文档
    •   GlobalUsings 文档
    •   TP 全局静态类文档
    •   中间件文档、筛选器文档、审计日志文档
    •   跨域文档、远程请求文档
  • 精彩贡献
    • !494 优秀 Pull Request 辩论典范
  • 本期亮点
  1. 极速入门
查看变化
Program.cs
Serve.Run();

[DynamicApiController]
public class HelloService
{
public string Say()
{
return "Hello, Furion";
}
}

启动浏览器查看效果,惊呆了吗!

  1. 内置错误页
查看变化
using Furion.FriendlyException;

public IActionResult Add(Person person)
{
if(!ModelState.IsValid)
{
return new BadPageResult();
}
}
  1. Swagger 支持 Markdown
查看变化
/// <summary>
/// 测试 Markdown
/// </summary>
/// <remarks>
/// # 测试 `Markdown` 注释
///
/// ![](https://localhost:44316/images/logo.png)
///
/// ```cs
/// Serve.Run();
///
/// [DynamicApiController
/// public class HelloService
/// {
/// public string Say()
/// {
/// return nameof(Furion);
/// }
/// }
/// ```
///
/// 功能还不错!!!
///
/// | 商品 | 价格 | # 其他 |
/// |--------------|-----------|------------|
/// | Juicy Apples | 1.99 | *7* |
/// | Bananas | **1.89** | 5234 |
/// | Bananas | **1.89** | 5234 |
/// | Bananas | **1.89** | 5234 |
///
/// -----
///
/// # Furion 探索版
///
/// > 在过去一年,实现 `Furion` 从无到有,编写文档已逾百万字,过程心酸开源人自知。
/// >
/// > 这一路日夜兼程,嘲讽批评常伴眼耳,即便辛苦无奈、想过放弃,但为了那微不足道的存在感依然努力着。
/// >
/// > 当然,也收获了不少...越来越多拥趸者,越发精湛技术能力,更高层次思维模式,还有许多跨界跨行朋友。
/// >
/// > 在 《[开源指北] (https://gitee.com/opensource-guide/comments/)》中,我曾说道:“开源如同人的脸,好坏一面便知,缺点可能会受到嘲讽批评,优点也会收获赞扬尊重。别担心,他们正在塑造更好的你。”
/// >
/// > 所以,这一次重新起航,重塑 `Furion` 重塑自己。也许未来在某个 IT 圈但凡有人谈起 `.NET` 还能瞟到 `Furion` 的身影。
///
/// ---
///
/// 🎉 探索 Furion 未来更多可能性,实现无第三方依赖的版本,所有模块功能按需安装,按需加载。
///
/// - 作者:[百小僧] (https://gitee.com/monksoul)
/// - 日期:2021 年 08 月 30 日
///
/// ## 环境
///
/// - IDE :[Microsoft Visual Studio Enterprise 2022 Preview(64 位) 版本 17.0.0 Preview 3.1] (https://visualstudio.microsoft.com/zh-hans/vs/preview/)
/// - SDK :[.NET SDK 6] (https://dotnet.microsoft.com/download/dotnet/6.0)
/// - 语言:[C# 10](https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-10)
///
/// ## 包说明
///
/// - `Furion.Core`:无第三方依赖,可在 `.NET 6` 所有项目类型中运行。
/// - `Furion`:内部依赖 `Furion.Core` 且无第三方依赖,**聚焦 `Web` 应用**,采用共享框架 `<FrameworkReference Include="Microsoft.AspNetCore.App" />` 模式
/// </remarks>
public void MarkdownTest()
{
// ....
}

v3.5.7(已发布)

  • 新特性
    •   Options 选项属性支持自定义 Key 名称,[MapSettings("key")] #I5B2HN
    •   事件总线模块事件 Id 支持枚举类型 2f328aa
    •   事件总线模块发布者 PublishAsyncPublishDelayAsync 重载 2f328aa
    •   事件总线模块扩展方法:Enum.ParseToString()String.ParseToEnum() 2f328aa
    •   FurionSqlSugar 脚手架 🆕🆕🆕 8d9293d
    •   Dapper 扩展全局配置委托 #I5AYFX
    •   sql 转实体支持多种命名策略(纯大写,纯小写,带下划线分割等等),如 Oracle 数据库 a90e245
    •   FS.InitalContentTypeProvider() 扩展方法,获取系统内所有支持的 Content-Type 文件提供器 6099900
  • 突破性变化
    •   彻底解决了 Furion 不能单文件发布的问题 7e8e0b7
  • 问题修复
    •   框架规范化文档 Swagger 不支持 Controller 派生类 api 路由问题,原生 ASP.NET 是支持的 29e47bc
    •   基于 Schema 多租户配置无效问题 6f820ce
    •   指定实体 [Table(schema:"dbo")] 特性后 Schema 无效问题 6f820ce
    •   数据库视图不支持 Schema 配置问题 6f820ce
    •   规范化结果极端情况下出现 空异常 问题 c9b0ef
  • 其他更改
    •   axios-utils.tsangular-utils.ts ,新增请求拦截携带刷新 Token 的时机判断 82f89bd
    •   规范化文档 Swagger 加载继承注释 <inheritoc /> 性能小优化 5f06880
    •   脚手架模板,新增 GlobalUsings.cs 模式
    •   对象映射默认支持忽略大小写 !486
  • 文档
    •   Furion 单文件发布文档
    •   Furion + SqlSugar 脚手架文档
    •   事件总线文档、选项文档、即时通讯文档、.NET5 升级 .NET6 文档、依赖注入文档、跨域文档、数据加解密文档
  • 本期亮点
  1. 事件总线 Id 支持枚举类型
查看变化
EventSubscribe("TO:DO")] // 字符串类型
public async Task EventHandler1(EventHandlerExecutingContext context)
{
// ....
}

[EventSubscribe(YourEnum.Some)] // 枚举类型
public async Task EventHandler2(EventHandlerExecutingContext context)
{
var eventEnum = context.Source.EventId.ParseToEnum(); // 将事件 Id 转换成枚举对象
// ....
}
  1. 事件总线发布支持更简单调用
查看变化
// 旧版本
await _eventPublisher.PublishAsync(new ChannelEventSource("ToDo:Create", name));

// 新版本
await _eventPublisher.PublishAsync("ToDo:Create", name);
await _eventPublisher.PublishAsync(YourEnum.Some); // 也支持枚举
  1. 选项支持属性自定义配置 Key
查看变化
"AppInfo": {
"Name": "Furion",
"Version": "1.0.0",
"Company_Name": "Baiqian" // 可以和属性不一样
}
public class AppInfoOptions : IConfigurableOptions
{
public string Name { get; set; }
public string Version { get; set; }

[MapSettings("Company_Name")] // 支持自定义
public string Company { get; set; }
}
  1. 日志规范化模板
查看变化
// 生成模板字符串
var template = TP.Wrapper("Furion 框架", "让 .NET 开发更简单,更通用,更流行。",
"[作者] 百小僧",
"[当前版本] v3.5.3",
"[文档地址] https://furion.net",
"[Copyright] 百小僧, 百签科技(广东)有限公司");
Console.WriteLine(template);

输出结果

┏━━━━━━━━━━━ Furion 框架 ━━━━━━━━━━━
┣ 让 .NET 开发更简单,更通用,更流行。

┣ 作者: 百小僧
┣ 当前版本: v3.5.3
┣ 文档地址: https://furion.net
┣ Copyright: 百小僧, 百签科技(广东)有限公司
┗━━━━━━━━━━━ Furion 框架 ━━━━━━━━━━━

v3.4.2(已发布)

  • 新特性
    •   规范化文件 EnableAllGroups 功能,可以将多个分组合并到一个分组中 9277b98
    •   angular-utils 客户端工具库,专门处理 angular 项目接口代理问题 6c70584
    •   Swagger 支持单个接口更多描述功能(支持 htmle5e1db0
    •   Swagger 接口 [Obsolete] 过时支持功能 e5e1db0
    •   动态 API[ApiDescriptionSettings] 特性 和DynamicApiControllerSettings 配置 的 ForceWithRoutePrefix 参数,支持强制复写 [Route] 特性并添加 DefaultRoutePrefix #I59B74
  • 突破性变化
    •   默认内置 GBKWindows-1252, Shift-JIS, GB2312 等编码支持 c456ecb
    •   FurionSqlSugar 脚手架
  • 问题修复
    •   <inheritdoc /> 不能跨程序集问题 3b9d39c
    •   <inheritdoc /> 不支持带参数,不支持隐式实现接口注释问题 #I59A6W#note_10699021
    •   v3.3.1 版本导致 Swagger 不能显示问题 6763352
    •   远程请求、JSON以及 Web 页面不支持 GBKGB2312 等国标编码问题 c456ecb
    •   远程请求响应报文设置了 Content-Type:charset= 不能自动转换编码问题 c456ecb
  • 其他更改
    •   axios-utils.tsangular-utils.ts 多客户端支持
  • 文档
    •   GlobalUsings 文档 文档地址
    •   请求大小/上传大小限制文档 文档地址
    •   规范化文档,Worker Service 文档,动态 API 文档
  • 本期亮点
  1. 启用 All Groups 分组功能
查看变化

有时候我们为了更好的对接口进行归类,配置了 Swagger 多个分组的功能,但这样也对生成客户端请求代码造成了困扰,所以添加了新的配置:

{
"SpecificationDocumentSettings": {
"EnableAllGroups": true
}
}
  1. 接口过时控制
查看变化

当我们某个接口已经过时,提示尽早调用最新接口,只需要在方法上面贴 [Obsolete] 即可,如:

[Obsolete("GetName() 已经过时,请调用 GetFrameworkName() 替代")]
public string GetName()
{
return nameof(Furion);
}

[Obsolete]
public string Other()
{
// ...
}
  1. 单一接口更多描述
查看变化

在该版本新增了 [ApiDescriptionSettings]Description 属性,支持定义更多描述,如:

[ApiDescriptionSettings(Description = "我是一段描述,显示更多内容 <button>我是按钮</button>")]
public string add()
{
//....
}

v3.3.3(已发布)

  • 新特性
    •   远程请求文件上传自动识别 Content-TypeMime #I57ZMN
    •   远程请求方法支持设置 Content-TypeEncoding #I57ZMN
    •   根据文件名获取 Content-TypeMime 类型 #8f78184
    •   规范化文档支持授权访问 #32aa3b6
    •   代码注释,规范化文档注释 inheritdoc 语法支持 ❤️️️️ #159A6W
    •   Vue2/3React 16.8+Angular 9+ 前端请求工具库,实现后端 API 代理 axios-utils
  • 突破性变化
    •   代码注释,规范化文档注释 inheritdoc 语法支持 ❤️️️️ #159A6W
    •   .NET 所有依赖包至 v6.0.5 版本
  • 问题修复
    •   自定义全局异常 Exception 后导致获取错误行号,文件空异常问题 #I53EGM
    •   配置数据库上下文传递空委托导致空引用异常问题 #I519AW
    •   字符串模板模板 Render 扩展方法返回 void 问题,应该返回 string Github-#99
    •   远程请求文件上传出现空情况问题(原因是缺失 Content-TypeI57ZMN
  • 其他更改
    •   框架源码引入 GlobalUsings 机制,减少代码体积 #7e9cc1c
    •   跨域请求的预检设置,如果未设置,则默认为 24 小时,主要解决前端多次发送 204 预检问题 4a11e7c
    •   视图引擎反射性能
  • 文档
    •   粘土对象序列化 JSON 配置文档
    •   前端解密 JWT 文档
    •  byte[]url 文档
    •   二级虚拟目录部署文档,远程请求文档,文件上传文档,安全授权文档、规范化文档
  • 本期亮点
    • ❤️️️️ 根据文件名获取 MIMEContent-Type 类型
查看变化
var success = FS.TryGetContentType("image.png", out var contentType); // image/png
  • ❤️️️️ 支持 Swagger 配置登录后才能访问
{
"SpecificationDocumentSettings": {
"LoginInfo": {
"Enabled": true,
"CheckUrl": "检查登录地址",
"SubmitUrl": "提交登录地址"
}
}
}

查看详细文档

  • ❤️️️️ 支持代码注释继承,Swagger 文档注释也支持
查看变化
/// <inheritdoc cref="ITestInheritdoc" />
public class TestInheritdoc : ITestInheritdoc, IDynamicApiController
{
/// <inheritdoc cref="ITestInheritdoc.GetName"/>
public string GetName()
{
return "Furion";
}

/// <inheritdoc />
public string GetVersion()
{
return "3.3.3";
}
}

/// <summary>
/// 测试注释继承
/// </summary>
public interface ITestInheritdoc
{
/// <summary>
/// 获取名称
/// </summary>
/// <returns></returns>
string GetName();

/// <summary>
/// 获取版本
/// </summary>
/// <returns></returns>
string GetVersion();
}

查看详细文档


v3.2.0(已发布)

  • 新特性
    •   IFormFile 扩展方法 ToByteArray() da69640
    •   规范化文档 ServeDir 虚拟目录配置功能,支持一键将一级目录切换至二级目录部署(IIS)8718392
  • 突破性变化
    •   所有依赖包至最新版
    •   依赖注入模块核心代码,移除注册服务采用反射机制,减少反射性能损耗 acdb315
  • 问题修复
    •   Swaggerschema 类型如果是 C# Object 类型无法正确生成前端代码问题 Swagger 官方 Issue 1a25274
    •   Worker Service 发布成 Windows Services 时日志绝对路径问题 感谢 @jacoat !467
    •   NginxIIS 对二级虚拟目录配置不同导致 404 问题 8718392
    •   远程请求模块未初始化 OnRequestFailded 导致空异常问题 #I54PK7
    •   依赖注入反射出现 Not found Method bug #I546L1
  • 其他更改
    •   定时任务失败后异常处理逻辑,感谢 @程小胜 !463
  • 文档
    •   定时任务文档,日志文档
    •   文件上传/下载 文档,包含单文件/多文件/Base64/Byte[]

v3.1.0(已发布)

  • 新特性
    •   远程请求模块异常 Http 状态码 !462
    •   动态 WebAPI 支持小驼峰配置 #I4W1R4
    •   远程请求 SendAsByteArrayAsync 等一系列方法,支持返回 byte[] !452
    •   远程请求 GZip 压缩支持 #I506S5
  • 突破性变化
    •   .NET6 依赖包全部升级至 NuGet 最新版 v6.0.3
  • 问题修复
    •   .NET6 WebApplication 模式二级虚拟目录问题 #I4UZLM #I4PZ0C
    •   日期验证不支持 2022-03-01 0:00:00(现在支持小时域 000) 问题 #I4Y3NT
    •   环境配置和文件配置优先级问题
    •   脱敏模块替换敏感词汇只替换最后一个 bug #I4YFA0
    •   远程请求返回字符串个别情况出现中文乱码问题 #I50GBD
    •   [DataValidate] 配置 AllowNullValueAllowEmptyString 无效问题 #I4ZZBE
  • 其他更改
    • [过时] 标记 Furion.Extras.Logging.Serilog 扩展包 IWebHost 扩展为过时状态
  • 文档
    •   优化文档体验,新增面包屑导航,重写文档缓存,提升文档访问速度
    •   更新动态 API 文档、配置文档、远程请求文档
    •   更新二级虚拟目录文档
  • 本期亮点
  1. 新增动态 WebApi 支持小驼峰路径,如 GetMyName -> getMyName
查看变化
{
"DynamicApiControllerSettings": {
"LowercaseRoute": false,
"KeepName": true,
"AsLowerCamelCase": true
}
}
  1. 支持 .NET6 WebApplication 模式二级虚拟目录配置:
查看变化
Progame.cs
app.UseVirtualPath(app =>
{
app.UseInject(String.Empty); // 注意 String.Empty 只是例子,可以不填或填其他的,见一分钟入门
app.MapRouteControllers();
});

v3.0.0(已发布,.NET6)

v3+ 版本说明

Furion v3.x 版本采用.NET6 构建。

  • 新特性
    •   远程请求支持 GET 请求自动转换 类类型 类型对象 #I4HR5Q
  • 突破性变化
    •   全面支持 .NET6 版本
  • 问题修复
    •   开启规范化结果并自定义全局异常导致异常经过 OnSucceeded 过滤器 bug #I4DTVL
    •   .NET5.0.5+.NET6 微软底层修改了 [ApiController] 验证失败返回 IActionResult 类型 #I4ISOK
    •   EFCore 6.0 适配 SqlServer 2005+ 出错 #I4ILA5
    •  .NET6 获取配置对象如果不存在返回 null 问题,.NET5 则返回初始对象 94ae4d
    •   Sql 命令参数传入 Clay 类型异常问题 #I4D21Q
    •   Cron 定时任务特性方式 bug #I4OJQI
  • 其他更改
    •   ToPagedList 泛型约束 d0244d
  • 文档
  • 特别鸣谢