Skip to main content

1.6 更新日志

Furion 框架发版规则

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

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

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


以上都是无偿提供,感谢一如既往的支持 Furion

v3.7.0(当前版本)

  • 新特性

    • [新增] 跨域 WithExposedHeaders 默认配置 access-tokenx-access-token 42ebdfd
    • [新增] 脚手架默认启用 app.UseHttpLogging() HTTP 日志 42ebdfd
    • [新增] FurionASP.NET Core 完整 json 配置的 JSON Schema 架构 JSON Schema
  • 突破性变化

    • [新增] FurionASP.NET Core 完整 json 配置的 JSON Schema 架构 JSON Schema
  • 其他更改

    • [调整] 脚手架所有 .json 文件,默认添加 JSON Schema 支持
  • 文档

    • [新增] Vue/React/Angular 请求代理文档
    • [新增] JSON Schema 文档,支持配置智能提示和验证
    • [更新] 跨域文档、规范化文档、配置文档、日志文档
  • 本期亮点

  1. 新增 JSON Schema 支持,所有 .json 文件支持智能提示和验证
{  "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft": "Warning",      "Microsoft.Hosting.Lifetime": "Information",      "Microsoft.EntityFrameworkCore": "Information",      "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"    }  },  "AllowedHosts": "*"}

查看更多 JSON Schema 文档

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

查看文档


v3.6.9(已发布)

  • 新特性

    • [新增] 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
    • [新增] EventBus 模块事件 Id 支持枚举类型 2f328aa
    • [新增] EventBus 模块发布者 PublishAsyncPublishDelayAsync 重载 2f328aa
    • [新增] EventBus 模块拓展方法: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.icu",    "[Copyright] 百小僧, Baiqian Co.,Ltd.");Console.WriteLine(template);

输出结果

┏━━━━━━━━━━━  Furion 框架 ━━━━━━━━━━━┣ 让 .NET 开发更简单,更通用,更流行。┣ 作者:        百小僧┣ 当前版本:     v3.5.3┣ 文档地址:     https://furion.icu┣ Copyright:   百小僧, Baiqian Co.,Ltd.┗━━━━━━━━━━━  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(已发布)

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
  • 文档

  • 特别鸣谢


v2.20(已发布)

v2.20+ 版本说明

Furion v2.20+ 版本后采用 Jaina 事件总线替换原有的 EventBus

  • 新特性

    • [新增] 远程请求支持 GET 请求自动转换 类类型 类型对象 #I4HR5Q
  • 突破性变化

    • [重构] EventBus 模块,采用 Jaina 方式
  • 问题修复

    • [修复] 开启规范化结果并自定义全局异常导致异常经过 OnSucceeded 过滤器 bug #I4DTVL
    • [修复] .NET5.0.5+ 微软底层修改了 [ApiController] 验证失败返回 IActionResult 类型 #I4ISOK
    • [修复] 远程请求上传文件异常 0c0752
    • [修复] 框架启动不支持环境变量 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 配置 !438
    • [修复] 定时任务内存和 CPU 占用及特殊情况下空异常问题 12c65de
    • [修复] 默认控制器启用规范化结果无效 bugc7a4a5e
    • [修正] 依赖注入 InjectionAttribute 特性的 ExceptInterfaces 单词拼写错误问题 !436
    • [修复] Sql 命令参数传入 Clay 类型异常问题 #I4D21Q
  • 其他更改

    • [优化] InjectionAttribute 代码 !435
    • [移除] ToPagedList 泛型约束 d0244d
  • 文档

    • [新增] 事件总线新文档

v2.19(已发布)

  • 新特性

    • [新增] 定时任务监听器 ISpareTimeListener #I468Q1
    • [新增] 执行 Sql 支持 JsonElement 参数 61985d6
    • [新增] Swagger 配置枚举及标签排序过滤器 #I46LON !404
    • [新增] 远程请求 application/octet-stream 类型默认支持 d9bad03
    • [新增] 远程请求代理模式请求报文头支持 IDictionary<string ,object> 类型。0204c0a
    • [新增] MongoDB 拓展类,添加更多常用操作方法 !423
    • [新增] DateTimeOffset? 转换 DateTime 拓展(包含互换) !432
  • 问题修复

    • [修复] Scoped.CreateEFCore 进行 Add-Migration 时候报空异常问题,原因是在 PM 环境中不存在根服务0853e74
    • [修复] 定时任务执行异常后异常一直驻留内存问题,修正为执行成功自动清空过去异常 197a62b
    • [修复] Jwt 拓展包不正确的代码导致 IOptions 失效#I46LUP
    • [修复] Swagger 枚举 Schema 过滤器不输出值问题 #I46LON !404
    • [修复] Swagger 处理非 int 类型枚举转换 bug #I46QJ9
    • [修复] 视图引擎编译模板生成 dll 后再次加载出现 IL 格式化错误问题 ff52d38
    • [修复] 管道 Channel 读取器无法释放 Handler 对象问题 10f4a90
    • [修复] Worker Services 下日志不输出问题 c482548
    • [修复] 远程请求 multipart/form-data 类型对接微信小程序上传文件 问题 d9bad03
    • [修复] 工作单元上下文在某些情况下共享事务失效问题 006d439
    • [修复] Swagger 枚举值在 GET 请求中 Schema 显示不正确问题 fb72fd7
    • [修复] 远程请求 404 不走异常过滤器问题 !426
    • [修复] 自定义事件总线并发情况下调用完成后无法正确处理队列数据 !429
    • [修复] v2.19+ 版本之后模块化开发加载外部程序集失效问题 !433
    • [修复] 定时任务 SpareTime 频繁检查导致 CPU 增高问题 aa0a2ee
  • 特别鸣谢


v2.18(已发布)

  • 新特性

    • [新增] Furion.Tools.CommandLine 拓展库 查看源码
    • [新增] 基于 AsyncLocal<T>CallContext 实现 9057a21
    • [新增] 远程请求可配置请求异常重试策略 656da87
    • [新增] 远程请求 OnRequestFailded 事件 4a3da4b
  • 突破性变化

    • [移除] Scoped 所有带返回值方法 656da87
    • [调整] ConfigureService 中调用 App.GetOptions<>() 获取配置逻辑 afa4ac3

在过去,很多开发者总是喜欢在 Startup.cs 配置服务的 ConfigureService 方法中解析服务,这样导致内存存在溢出风险,GC 无法回收。 正确的方式是尽可能的避免 ConfigureService 中解析服务。如果需要在【启动时】获取 配置选项,请使用 App.GetConfig<TOptions>(路径, true) 代替 App.GetOptions<TOption>

  • 问题修复

    • [修复] v2.16+ 版本重构 AppDbContextBuilder 之后写错实体类型 #I45E6M
    • [修复] 远程请求单个值序列化错误处理方式 3282eba
    • [修复] v2.17.3+ 单元测试创建 TestServer bug #I45JR3
    • [修复] Retry.Invoke 正常方法死循环 bug !392
    • [修复] 刷新 Token 生成新 Token 存在数组/集合类型导致 Key 重复异常问题 aeea2b1
    • [修复] 远程请求序列化引用类型对象(不含 string)不正确的处理 93cf63a
    • [修复] AppDbContext 默认租户属性受工作单元影响问题 e51557f
  • 文档

    • [新增] 包管理工具文档
    • [更新] 模板引擎、Sql 操作,数据库上下文 等等文档

v2.17(已发布)

  • 新特性

    • [新增] IPC(Inter-Process Communication,进程间通信) 模块功能,目前提供进程内通信和共享内存进程外通讯 ProcessChannel
    • [新增] 远程请求 application/xmltext/xml 默认支持 4753a1a
    • [新增] 控制台全局异常拦截 4a4fe1f
    • [新增] 支持自定义 .json 配置文件扫描目录 3e2910a
    • [新增] 支持数据库实体接口显式实现接口配置 9610a0a
    • [新增] 控制台应用程序全局拦截 [IfException] 支持 4a4fe1f
    • [新增] 依赖注入模块接口可以限制实现类生存周期,实现类也支持复写生存周期 d2ce089
  • 突破性变化

    • [抽离] Oops.Retry() 重试策略功能至新类:Retry.Invoke() 6a7bbd0
    • [移除] IHttpContextAccessor.SigninToSwagger() 拓展,请使用 IHttpContextAccessor.HttpContext.SigninToSwagger(),退出也一样
    • [移除] 全局处理 Request Body 重复读处理 Request.EnableBuffering() d92c24b
  • 问题修复

    • [修复] 规范化状态码过滤逻辑错误问题 #I44JYS
    • [修复] 非关系型数据库(内存数据库)注册及操作异常 e167651
    • [修复] 远程请求默认序列化问题 a55603b
    • [修复] 定时任务零点/整点提前一秒触发问题 #I4321L
    • [修复] 友好异常在子类重写抽象类方法内部抛异常无法获取的问题 4a4fe1f
    • [修复] 修复非 Web 项目抛异常问题 4a4fe1f
    • [修复] 数据库实体模型贴 [NotMapper] 特性无效 #I44MNO
  • 其他更改

    • [调整] Swagger 生成泛型 SchemaIds 默认连接符,由 Of 改为 _ 81946b6

v2.16(已发布)

  • 新特性

    • [新增] MVC 控制器支持规范化处理 #I427Z2
    • [新增] throw Oops.Bah() 抛出业务异常(状态码 400
    • [新增] UnifyResultSettings 规范化 json 配置选项 #I42NY7
    • [新增] 多语言自定义配置资源文件名及自定义程序集 #I434YJ
  • 突破性变化

    • [调整] 规范化结果 IUnifyResultProvider 参数 (破坏性更改) #I427Z2
    • [调整] IJsonSerializerProvider 接口参数,去掉 inherit 参数 a55603b
新版本自定义规范化结果
using Furion.DataValidation;using Furion.DependencyInjection;using Furion.UnifyResult.Internal;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters;using System;using System.Threading.Tasks;namespace Furion.UnifyResult{    /// <summary>    /// RESTful 风格返回值    /// </summary>    [SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]    public class RESTfulResultProvider : IUnifyResultProvider    {        /// <summary>        /// 异常返回值        /// </summary>        /// <param name="context"></param>        /// <param name="metadata"></param>        /// <returns></returns>        public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)        {            return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors));        }        /// <summary>        /// 成功返回值        /// </summary>        /// <param name="context"></param>        /// <param name="data"></param>        /// <returns></returns>        public IActionResult OnSucceeded(ActionExecutedContext context, object data)        {            return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));        }        /// <summary>        /// 验证失败返回值        /// </summary>        /// <param name="context"></param>        /// <param name="metadata"></param>        /// <returns></returns>        public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)        {            return new JsonResult(RESTfulResult(StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));        }        /// <summary>        /// 特定状态码返回值        /// </summary>        /// <param name="context"></param>        /// <param name="statusCode"></param>        /// <param name="unifyResultSettings"></param>        /// <returns></returns>        public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)        {            // 设置响应状态码            UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);            switch (statusCode)            {                // 处理 401 状态码                case StatusCodes.Status401Unauthorized:                    await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 Unauthorized")                        , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);                    break;                // 处理 403 状态码                case StatusCodes.Status403Forbidden:                    await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden")                        , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);                    break;                default: break;            }        }        /// <summary>        /// 返回 RESTful 风格结果集        /// </summary>        /// <param name="statusCode"></param>        /// <param name="succeeded"></param>        /// <param name="data"></param>        /// <param name="errors"></param>        /// <returns></returns>        private static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)        {            return new RESTfulResult<object>            {                StatusCode = statusCode,                Succeeded = succeeded,                Data = data,                Errors = errors,                Extras = UnifyContext.Take(),                Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()            };        }    }}
  • 问题修复

    • [修复] MVC 控制器启用规范化处理后返回 new Json({}) 对象为 null 问题 #I4354S
  • 其他更改

    • [优化] 多语言底层设计,取消需要创建 Lang.cs 空类的要求 #I434YJ
    • [优化] MiniProfiler 性能,减少不必要的监听

v2.15(已发布)

  • 新特性

    • [新增] Db.GetDbRepository<定位器>() 静态方法 #I41MZP
    • [新增] 远程请求缺省序列化配置选项 #I41PBW
  • 问题修复

    • [修复] 自动扫描接口进行依赖注入获取首个接口错误 bug #I41D1M
    • [修复] IRepository<TEntity> 没有实现 IRepository<TEntity, TDbContextLocator> 问题 #I41MZP
    • [修复] 远程请求缺省序列化 bug #I41PBW
    • [修复] 修复 AppDbContext.Tenant 多租户空异常问题 #I421DA
    • [修复] Worker Service 多个 Worker 定时任务阻塞问题 82a79cc
    • [修复] Jwt 自动刷新机制时区处理问题,主要针对国外用户 #I41UB1 82a79cc
  • 其他更改

    • [优化] 系统启动性能,从 106M 减少到 84M
    • [优化] 大量底层代码,包大小从 391Kb 减少到 350Kb(不带注释版本仅 64Kb)

v2.13/v2.14(已发布)

  • 新特性

    • [新增] 简易字符串模板功能,支持远程请求、数据库模块、日志模块、事件总线模块、定时任务模块、异常模块、数据校验模块 #I402BL
    • [新增] 404 状态码规范化默认处理 #I408F5
    • [新增] 定时任务 ISpareTimeWorker 声明方式支持异步方法 #I40KWR
    • [新增] 自动配置二级虚拟目录 !354
  • 突破性变化

    • [升级] 框架依赖 SDK.NET 5.0.8 版本
    • [移除] Db.GetNewDbContext() 静态方法 #I400BK
    • [移除] 数据库模块时态表拓展支持 #I405HI
    • [调整] IJsonSerializerProvider 接口参数,新增 inherit 参数 #I3ZQU5
    • [调整] AppSettings 配置的 LogEntityFrameworkCoreSqlExecuteCommand 名称为 OutputOriginalSqlExecuteLog #I40VVE
  • 问题修复

    • [修复] Worker Services 定时任务边界值问题导致跳过单次任务 #I405NI
    • [修复] Worker Services 独立发布后程序集扫描失效 bug #I3ZH3X
    • [修复] 远程请求如果配置了 Client 客户端但传入了空 RequestUrl 地址导致异常问题 #I40BC6
    • [修复] 规范化结果篡改非短路端状态码出现异常 bug #I408F5
  • 其他更改

    • [优化] App.GetServiceProvider(type) 解析服务性能 #I40KXN
    • [调整] 视图引擎保存成文件流默认缓存区大小,从 4096 提升至 8192 #I40KH5

v2.10/2.11/2.12 (已发布)

该版本有多个破坏性更改,更新时请认真查看。

  • 新特性

    • [新增] App.Configuration.Reload() 拓展 #I3XYI8
    • [新增] ISubscribeHandler 支持异步方法定义 #I3XYHJ
    • [新增] app.UseUnifyResultStatusCodes() 可配置修改返回状态码 #I3VZQH
    • [新增] 远程请求添加默认 User-Agent#I3W17C
    • [新增] 支持 Sql 高级代理切换数据库上下文定位器 #I3XFP6 #I3XDCR
    • [新增] 定时任务 CronFormat 自动识别 #I3Y7GT
    • [新增] Sql 高级代理 拦截功能 #I3YHG4
    • [新增] 拦截远程请求所有异常处理 #I3YPDE
    • [新增] 远程请求配置 Timeout 超时时间 #I3YPPK
    • [新增] 新增 RSA 加密算法 #I3YZNU !345
    • [新增] DataTableDataSet 支持不指定强类型返回 #I3Z6RI
    • [新增] Sql 字符串拓展方法设置 Timeout 超时时间 #I3ZKWF
    • [新增] Sql 高级代理 [Timeout] 特性,设置超时时间 #I3ZKWF
  • 突破性变化

    • [移除] FakeDelete 假删除/软删除所有功能 #I3XKII
    • [移除] 移除 PBKDF2 加密算法 #I3Z0IO
    • [调整] 远程请求设置超时时间单位由 分钟 改为 #I3YPPK
    • [调整] IJsonSerializerProvider 接口参数,新增 inherit 参数 #I3ZQU5
    • [调整] [NonAutomatic] 特性名称为 [Manual] #I3XKKX
    • [调整] [NotChangedListener] 特性名称为 [SuppressChangedListener] #I3XKLZ
    • [调整] [ManualSaveChanges] 名称为 [ManualCommit] #I3XKNP
    • [调整] DbContext.TenantIdQueryFilterExpression 名称为 DbContext.BuildTenantQueryFilter #I3XKTB
    • [调整] [SkipScan] 名称为 [SuppressSniffer] #I3XN5N
    • [调整] [SkipProxy] 名称为 [SuppressProxy] #I3XN7O
    • [重构] Sql 执行,性能提升 20% #I3W33U
  • 问题修复

    • [修复] 动态 WebAPI 扫描控制器没有屏蔽没有注册的第三方控制器 #I3Y7TJ
    • [修复] AppDbContext 设置 TablePrefix 无效: #I3Y57Q
    • [修复] 修复定时任务使用异步委托导致程序终止 bug #I3XVZ0
    • [修复] 事件总线一个 消息id 对应多个 Handler 只触发第一个#I3XYP0
    • [修复] .ToPagedList() 分页方法传入小于或等于 0 的页码 #I3XNAN
    • [修复] JSON 序列化默认 DateTimeOffset 异常 #I3XMOL
    • [修复] 继承 Serilog 日志在 Worker Service 生成重复日志 bug #I3WA0L !331
    • [修复] 粘土对象 动态添加 Clay 类型 bug #I3W9LW
    • [修复] ValidationTypes.Numeric 校验数值类型正则表达式错误 #I3WADS
    • [修复] 数据库命令参数 DbParameterValueobject 类型的时候且不指定 #I3YKM6
    • [修复] Oracle 数据库存储过程 游标参数 报错问题 #I3ZBYE
    • [修复] Worker Services 采用独立发布后无法执行问题 #I3ZH3X
    • [修复] 修复远程请求如果无返回值序列化异常问题 !348
  • 其他更改

    • [增强] 支持 appsettings.json 等自定义配置文件中文命名 #I3YBFD
    • [改进] 远程请求配置命名客户端 BaseAddress 地址兼容处理 #I3YCRH
    • [移除] 框架无用代码、优化代码
    • [优化] Furion非 Web 环境下性能
  • 文档变化

    • [新增] 会话和状态管理 文档 #I3YI3G
    • [更新] 远程请求、日志、数据库上下文、远程请求、Sql 高级代理文档
    • [更新] 配置文件 #I3Y2EV
  • 问答答疑

    • [答疑] dapper 多个数据源如何继承 #I3WUOI
    • [答疑] 关于 SpareTime 多次执行问题#I3XEQU
    • [答疑] 选项更改通知(热更新):数据库里的数据更改了如何通知选项进行改变? #I3XYI8
    • [答疑] SaaS 多租户添加时无法获取租户Id #I3Y5CF
    • [答疑] 获取 _httpContextAccessor.HttpContext 为空#I3Y6BI
    • [答疑] Ubuntu 中使用 App.Configuration 方法读取不到值 #I3Y74H
    • [答疑] 数据库上下文作用域问题 #I3YHXP
    • [答疑] 使用 UnitofWork 提交事务,可以提交成功,但是系统会有错误 #I3YIWU
    • [答疑] 数据库读写分离--非默认主库的从库随机该如何配置? #I3YVR7
  • 不做实现

    • [废弃] SpareTIme 新增 Dashboard 控制台看板,同时可以对任务进行暂停、删除、查看#I3XELY

v2.9.0 (已发布)

  • 新特性

    • [新增] 应用全局未托管资源监听,并实现特定时机释放非托管资源 #I3VXAU
    • [新增] 不包含 EntityFramework.Core 版本的 Furion.Pure#I3VGW8
    • [新增] swagger 支持设置多语言方式,设置的语言自动添加到 api 地址后面 #I3VDTD
    • [新增] 动态 WebAPI 支持 [FromRoute] 非必填(选填)参数设置 #I3VFIM
    • [新增] 动态 WebAPI 参数支持配置路由约束 #I3VFIR
    • [新增] MD5DESC 加密支持 大写 输出 #326
  • 突破性变化

    • [新增] Furion 所有包生成 .snupkg 包,支持开发阶段直接调试 Furion 所有包源码 #I3VFIX
    • [调整] repository.BuildChange() 方法的返回值,多返回一个 IServiceScope 对象 #I3VX3D
    • [调整] JWT 刷新 Token 方法 AutoRefreshToken 参数 days 改为 minutes #I3VXNB
  • 问题修复

    • [修复] App.GetOptionsSnapshot<> 从根服务解析异常 bug #I3VS2X
    • [修复] 修复远程请求如果出现异常,返回 Stream 为 null 导致异常的问题 #I3VSTU
    • [修复] 如果实体被跟踪后,无法执行删除操作 #I3W08P
  • 其他更改

    • [优化] 运行时内存,实现请求结束自动释放未托管资源 #I3VXAU
  • 文档变化

    • [更新] App 静态类文档、远程请求文档、分表分库文档
  • 问答答疑

    • [答疑] 动态 WebAPI,自定义根据方法名生成 [HttpMethod] 规则报错 #I3VKQG
    • [答疑] InsertAsync 的时候提示 ID 为空 #I3VS7E
    • [答疑] FirstOrDefault 自动过滤了 TanantId 字段 #I3W0VH
    • [答疑] 对方接口返回 HttpConnectionResponseContent 远程请求拿不到返回值 #I3W17C
    • [答疑] 查询方法 FindOrDefault 报错 #I3W830
    • [答疑] SqlNonQueryUnitOfWork 循环执行#I3W8WW
    • [答疑]Swagger 配置问题,导致 Swagger 中不能自动携带 token 授权的问题 #I3W934
    • [答疑] 远程请求 SetBody 参数识别不了#I3WBM1
    • [答疑] Scoped.Create 里执行 sql.SqlNonQuery() 或者 obj.insert() 问题#I3WB5O
    • [答疑] 调用函数或存储过程,怎么出参数据自定义对象?如 Oracle数据库的数组或记录 #I3W71W
  • 不做实现

    • [无效] 数据库小写下划线字段,无法自动映射成小驼峰 #I3W021
    • [废弃] EfCore 5 直接多对多时进行 SeedData #I3WDRJ

v2.7.0/2.8.0 (已发布)

  • 新特性

    • [新增] throw Oops.On("异常消息") 应用多语言支持 #I3UYC2
    • [新增] Db.GetMSRepository() 获取主从库仓储静态方法 #I3UBSJ
    • [新增] 工作单元特性,支持静态类强制性开启共享事务 #I3S9N8
    • [新增] EFCore 执行 sql 模式打印日志 #I3SE8X
    • [新增] 远程请求支持默认 HttpClient 配置 #I3SI17
    • [新增] 新增 短 ID 生成功能 #I3T7JP
    • [新增] [SensitiveDetection] 支持配置替换敏感词汇 #I3THIA
    • [新增] SpecificationDocumentBuilder.DocumentGroupsSpecificationDocumentBuilder.CheckApiDescriptionInCurrentGroup(currentGroup, apiDescription) 公开方法#I3UDSY
  • 突破性变化

    • [重构] 自动扫描 .json.xml 文件并加载到配置中的代码和规则,同时移除默认 .xml 文件加载,只保留 .json 文件 #I3UJ3L
    • [重构] 分布式连续 GUID 代码 #I3UBK0
    • [调整] Scoped.CreateUnitOfWork 名称为 Scoped.CreateUow #I3SJPU
    • [调整] JWTEncryption.Validate 返回值,支持返回 TokenValidationResult #I3S2ND
  • 问题修复

    • [修复] [DataValidation][SensitiveDetection] 多语言应用失效 #I3UH6U
    • [修复] Scoped 系列方法异步出现 Task is cancel 情况 #I3SJF6
    • [修复] Mysql 数据库的 ToPagedList 方法返回的结果进行遍历出现 MySqlConnection is aleady use 问题 #I3SJQ3
    • [修复] tool/cli.psl 没有包含项目名称 #I3S1T6
    • [修复] 远程请求做上传文件时,没有传入 Body,程序直接跳过 #I3TKFH
    • [修复] 远程请求 multipart/form-data 内容分割符缺失 #I3TNO9
    • [修复] 远程请求代理拦截方式返回 HttpResponseMessage 问题 #I3V161
    • [修复] repository.Database.SetCommandTimeout(600) 无法生效#I3VAQS
  • 其他更改

    • [改进] 支持规范化结果中间件判断是否跳过规范化结果 #I3T2AA
    • [调整] 更新部分列 UpdateIncludeNowAsync 具有二义性 #I3RW9Q
    • [优化] 框架底层性能,大大减少内存占用和溢出情况,启动内存从之前 136M 下将到 86M
    • [其他] 删除无用代码,优化不规范命名等
  • 文档变化

    • [新增] Inject 说明文档 #I3TITA
    • [更新] 4.2.9 的示例代码文档,方法没有放在 class 中 #I3S9T5
    • [修正] 规范化结果 6.5.6 多分组排序图片引用错误 #I3UBOQ
    • [更新] 静态类 Scoped 文档
  • 问答答疑

    • [答疑] 默认 MasterDbContextLocator 不随自定义的参数生成 #I3SDBB
    • [答疑] 事件总线中订阅处理程序类获取不到用户信息,这个正常吗 #I3SS0U
    • [答疑] 在有多租户过滤器的情况下,是否有一种方式查询全量的数据 #I3T0VI
    • [答疑] mysql 使用 &"tools/cli.ps1" 页面化加载表结构失败 #I3T4F8
    • [答疑] 其他 Web 层的 Startup 优先执行 #I3T8IP
    • [答疑] 辅助角色服务实现建议 #I3T906
    • [答疑] 开启 easy connection 后同一内网地址浏览器可以正常访问,远程请求则无法访问#I3TA2U
    • [答疑] scope.ServiceProvider.GetService<IOtherService>不存在 #I3TQMV
    • [答疑] 能否在 WPF 项目中使用呢? #I3TMCC
    • [答疑] Dapper 多个数据源 #I3TM9B
    • [答疑] L.GetSelectCulture() 方法异常 #I3TQS4
    • [答疑] 循环中使用 IDGen.NextID() 得到的结果并不是连续的 #I3UAF6
    • [答疑] 模块化动态加载插件支持通配符匹配.dll #I3UDT8
    • [答疑] MVC 模式,在 Controller 里快捷方式创建 View 页面出错 #I3UFGB
    • [答疑] 数据库迁移没有种子数据 #I3UI7G
    • [答疑] SpareTimeAttribute 中 根据 Cron 表达式 自动匹配 Cron 表达式格式化方式 #I3UTKQ
    • [答疑] 使用 workService 集成 SqlSugar 报错 #I3V8HJ
    • [答疑] sqlserver 2008 分页报错如何解决呢 #I3VF96
  • 不做实现

    • [废弃] 添加令牌桶限流算法 #I3SCDV
    • [废弃] 定时任务立即执行需求 #I3SF4A
    • [废弃] 文档建议 关于 reids 和 es 、消息队列的 #I3T90I
    • [废弃] IP 高频率请求限制 #I3UHE1
    • [废弃] Url 转发大模块 #I3TZHO

v2.5.0/2.6.0 (已发布)

  • 新特性

    • [新增] 虚拟文件服务,支持物理文件和嵌入资源文件 #I3RBR9
    • [新增] 读写分离/主从复制仓储 IMSRepositoryIMSRepository<TMasterDbContextLocator> 仓储,可进行随机或自定义获取从库
    • [新增] 数据脱敏处理 #I3R5ZF
  • 突破性变化

    • [移除] InsertOrUpdate 一系列数据库操作方法 #I3RI9L
    • [移除] 所有包含 Exists 单词的数据库操作方法 #I3RJ0T
    • [调整] 分布式 GUID IDGenerater 静态类名称为 IDGen #I3RGUA
  • 问题修复

    • [修复] 远程调用方法错误,请求报文头 Headers 不能添加到 IHttpDispatchProxy 的子接口上 #I3RAF7
  • 其他更改

    • [优化] 应用启动性能,减少内存分配
  • 文档变化

    • [新增] 脱敏处理文档 #I3R6WZ
    • [新增] 文件系统文档、FS 静态类文档 #I3RCC4
    • [更新] 读写分离/主从复制、数据库仓储文档、Db 静态类 #I3R3B6
  • 问答答疑

    • [答疑] 关于 Furion 集群部署 #I3R3J4
    • [答疑] 升级最新框架以后, 数据库生成模型报错 #I3R7TP
    • [答疑] 数据库上下文事务执行中,SaveNow 执行后有警告 #I3RAJI
    • [答疑] Hangfire 使用事务出现错误 #I3ROQ5
    • [答疑] 如何实现 cli 不执行某些表的迁移,web 请求可以正常操作呢? #I3ROU5
    • [答疑] 在使用定时任务时候出现的问题:继承 ISpareTimeWorker #I3RRZS
    • [答疑] MySql 时间差 8 小时处理 #I3RSCO
    • [答疑] Db.GetRepository<> 方法结合 [UnitOfWork] 后不可用 #I3RUK5
    • [答疑] 事务开启失败问题 #I3RYJY
    • [答疑] 支持 DbProvider 可动态配置 #I3RYPE
    • [答疑] WorkService 依赖注入 ISingleton 问题 #I3RZ1L
    • [答疑] ISpareTimeWorker 运行期动态修改 #I3S33Q
  • 不做实现

    • [拒绝] 有序 Guid 精度是固定的毫秒级:1 毫秒内生成的多个 Guid 是无序的 #I3R59J
    • [拒绝] 建议:JWTEncryption.Validate 方法返回 JWT 的检查失败时的原因 #I3S1F2

v2.4.0 (已发布)

  • 新特性

    • [新增] 支持自动加载模块化/插件 .xml 注释文件 #I3Q7XY
    • [新增] AppDbContext.FailedAutoRollback 属性,可配置事务是否自动回滚 #I3QOUS
  • 突破性变化

    • [升级] .NET 5 SDK 为 5.0.6 版本
    • [新增] IJsonSerializerProvider.GetSerializerOptions() 接口方法 #I3QIJN
  • 问题修复

    • [修复] 通过 services.AddInject() 方式注册,模块化/插件不加载 #I3Q7XH
    • [修复] 种子数据返回 null 报空异常 #I3QCM5
    • [修复] 通过 Clay.Object 创建粘土对象后属性变小写问题 #I3QRV3
  • 其他更改

    • [优化] Furion 框架底层性能,减少内存占用,提高应用初始化速度 92f8cc1
  • 文档变化

    • [更新] JSON 序列化文档、规范化结果文档、数据库上下文文档
  • 问答答疑

    • [答疑] InsertOrUpdateNowAsync 报错 #I3QKO5
  • 不做实现

    • [废弃] 定时任务自定义 Failed 事件 #I3QCM2
    • [废弃] 模块化动态生成数据库表 #I3QH3G
    • [废弃] 建议事件总线新增 MQ 支持 #I3QWZ4
    • [废弃] 重构规范化整个模块代码 #I3NFT7

v2.3.0 (已发布)

  • 新特性

    • [新增] Furion.Extras.DatabaseAccessor.MongoDB 拓展包支持 #I3PKST
    • [新增] 动态粘土类型直接转 objectdynamic 类型 #I3OY27
    • [新增] 新增 Oops.Retry 方法,支持设置方法调用失败进行重试 #I3PJKQ
    • [新增] JWTSettings 配置节点 Algorithm,用于配置加密算法 #I3PQGV
    • [新增] repository.EnsureTransaction() 方法确保工作单元事务有效 #I3PVF1
  • 突破性变化

    • [支持] 支持 .NET 6.0.0 Preview 3 版本 #I3P2C7
  • 问题修复

    • [修复] 使用数据库生成模型 tools/cli.ps1,从数据库表生成的实体异常 #I3PL18
    • [修复] 贴了 [NonUntify] 特性后,SwaggerExample Value 没有匹配正确 #I3PK0L
    • [修复] SpareTimer.TallyCron 表达式中计数无效 #I3PWSE
  • 其他更改

    • [改进] 框架默认序列化应该从配置中读取,而非手动编写 #I3P1SJ
    • [改进] SqlSugar 拓展库,支持非泛型仓储获取上下文操作对象 #I3PK2N
    • [改进] 支持分布式内存缓存可配置化 #I3POKD
  • 文档变化

    • [文档] 添加 JWTSettings 配置独立文档 #I3PQGW
  • 问答答疑

    • [答疑] 软删除如果数据不存在,则报错 #I3PTVB
    • [答疑] 多个类集成测试会造成数据库定位器多次注册,无法运行所有测试,只能一个类一个类的运行 #I3PXGY
  • 不做实现


v2.2.0 (已发布)

  • 新特性

    • [新增] Clay 粘土类型,支持让 C# 创建一个弱类型对象并操作弱类型 #I3O2QQ
    • [新增] 新增 Scoped.Create 带返回值重载 #I3O47J
    • [新增] 支持 Scoped.Create() 一系列方法支持传入作用域工厂 #I3OAP5
    • [新增] 支持事件总线同步执行方式 #I3OAW2
    • [新增] [DataValidation] 跳过空字符串和空值验证 #I3OGEN
    • [新增] Worker Service 可配置是否自动注册 Worker #I3OLW4
  • 突破性变化

  • 问题修复

    • [修复] 定时任务设置 cancelInNoneNextTime: false 一次也不执行 #I3O3N0
    • [修复] SpareTime 自定义下次执行时间出现空异常 #I3O46X
    • [修复] MiniProfiler 设置为 false 时,数据库上下文提交拦截器未添加 #I3OAWX
    • [修复] [Consumes("application/x-www-form-urlencoded")]ModelQuery 配置同时配置导致空引用问题 #I3ODUR
    • [修复] 在 Grpc 中使用 jwt 授权出现空异常 #I3OW3I
  • 其他更改

    • [优化] 支持发布后代码精简配置,减少不必要的文件夹输出 #I3OAPF
    • [优化] 自动刷新 Token 机制,新增容错值处理,解决并发 Token 刷新失败问题 #I3OGYF
  • 文档变化

    • [新增] 粘土对象文档 #I3OG18
  • 问答答疑

    • [答疑] 动态 WebAPI 如何获取接收文件 #I3O29B
    • [答疑] 定时任务使用 Scope.CreateUow 引发的问题 #I3O2CD
    • [答疑] 单文件发布程序工作不正常 #I3O4D8
    • [答疑] 同时配置租户过滤器和软删除过滤器,最终的 sql 只生成了一种过滤条件 #I3OB0A
    • [答疑] HTTP 重定向 HTTPS 后跨域失效 #I3OB8R
    • [答疑] 在 PostgreSql 数据库使用 rep.FirstOrDefault(u => u.Id == UserId); 引起异常 #I3O5OF
    • [答疑] 定时任务有时能触发有时不能触发 #I3ORBE
  • 不做实现

    • [作废] 框架中的 swagger 是否有提供导出文档为 markdwon/word 的功能计划? #I3OL8O
    • [作废] 数据库实体父子继承,子类生成的 SQL 不一样 #I3NHU3
    • [作废] 支持第三方数据库 ORM #I3OXA3

v2.1.0 (已发布)

  • 新特性

    • [新增] 新增定时任务 ISpareTimeWorker 方式支持 [SpareTime("{配置路径}}] 方式 #I3NTUX
    • [新增] 定时任务支持异步委托 #I3NP96
    • [新增] 轻量级分布式连续 GUID 生成器 #I3NKLZ
    • [新增] ClayObject 模块,处理 ExpandoObjectIDictionary<string,object> 类型 #I3N3J4
    • [新增] Scoped.CreateUow(handler) 创建作用域并自动提交数据库更改方法 #I3NU3G
  • 突破性变化

    • [调整] 规范化结果接口 OnResponseStatusCodes 方法,新增 UnifyResultStatusCodesOptions 参数 #I3NDB9
    • [移除] 雪花 ID 实现代码 #I3NKLZ
  • 问题修复

    • [修复] Swagger 不能支持非 int 类型的枚举 #I3NQM8
    • [修复] 数据库线程池多线程并发问题 #I3NR4L
    • [修复] 自定义控制器路由后且为方法参数指定了 [ApiSeat] 后生成路由重复 #I3NRF6
  • 其他更改

    • [改进] 支持应用启动的时候迁移种子数据 #I3NH3M
  • 文档变化

    • [新增] 分布式 ID 生成文档 #I3B6CX
    • [新增] 新增模块化开发文档 #I3NSUS
    • [更新] 20.4 字符串拓展方式 > 错误ToAESDecrypt 写成了 ToToAESDecrypt #
  • 问答答疑

    • [答疑] 有关【定时任务/委托】的疑问 #I3N3EW
    • [答疑] 统一返回格式支持自定义 #I3NU1G
  • 不做实现

    • [作废] 期待 IEnumerableExtensions 扩展 OrderBy 函数来支持分页排序 #I3NOQ9

v2.0.0 (已发布)

  • 新特性

    • [新增] 控制台应用程序及 Worker Services 支持 #I3K4DG
    • [新增] 完整任务调度功能 #I3IRUX
    • [新增] Cron 表达式解析 #I3IQ9Y
    • [新增] 支持 Swagger 自定义配置 swagger.json 地址模板 #I3IHMX
    • [新增] 支持配置动态 WebApi 区域 #I3IJAZ
    • [新增] 远程请求新增支持传入服务提供器 IServiceProvider #I3IVBL
    • [新增] 全局配置选型 SupportPackageNamePrefixs 配置,支持配置包前缀 #I3K0SN
    • [新增] 应用启动时支持 referenceassembly 类型程序集扫描 #I3K0SN
    • [新增] 依赖注入 AOP 拦截获取方法真实特性 #I3LZBX
    • [新增] EFCore 手动 SaveChanges() 特性 #I3N01Y
    • [新增] 支持 Cors 跨域更多配置 #I3N2J0
  • 突破性变化

    • [重构] 完整任务调度功能 #I3IRUX
    • [重构] 日志模块功能 #I3J2K0
    • [重构] 模板引擎功能 #I3J46E
    • [重构] 底层 EFCoreRepository 仓储 #I3J6W5
    • [重构] sql 字符串拓展底层代码 #I3IVCE
    • [重构] 底层 SqlRepository 所有逻辑代码 #I3J6V6
    • [重构] 数据库实体拓展方法 #I3J609
    • [调整] 事件事件总线同步执行为异步方式执行 #I3J0WA
    • [移除] 框架底层 HttpContext.IsAjaxRequest() 拓展 #I3IVAA
    • [移除] ValidationTypes.Required 验证 #I3KR85
  • 问题修复

    • [修复] 关闭 InjectMiniProfiler 参数后内存缓存无效 #I3IHLR
    • [修复] 在多租户中调用 Tenant 属性出现偶然性数据库上下文被释放的情况 #I3IC70
    • [修复] Sql 代理中如果返回基元类型抛出不能将 object 转换成对应类型的异常 #I3IC84
    • [修复] 存储过程多返回值的时候,outputvalues 的 name 不是定义的 MSG 的 name,是 Msg 类型。 #I3IC7Y
    • [修复] PhoneNumber 手机号验证正则表达式错误 #I3ID10
    • [修复] 依赖注入 AOP 拦截无法捕获内部异常 #I3IGCC
    • [修复] 全局拦截标记异常已被处理后异常过滤器依然执行 #I3J463
    • [修复] 自定义全局异常拦截器不起作用 #I3K1SJ
    • [修复] 在 WorkerService 模式下,还是使用 WebHostEnvironment 来判断 Host 环境,会导致错误 #I3LCQY
    • [修复] 定时任务 DoOnce 抛空异常 bug #I3M0ZT
  • 其他更改

    • [改进] 启动时程序集扫描类型 #I3K0SN
    • [改进] App.GetConfig<>("key") 不支持获取单个值问题 #I3ILF1
    • [改进] UrlEncode 应该用 Uri.EscapeDataString() 而不是 HttpUtility.UrlEncode #I3ICTK
  • 文档变化

    • [新增] 定位任务、后台任务文档 #I3JHHG
    • [新增] 辅助角色服务文档 #I3K5GN
    • [更新] 动态 WebAPI、规范化文档、数据库上下文文档
  • 问答答疑

    • [答疑] 数据校验,自定义 ErrorMessage 无效问题 #I3ICL3
    • [答疑] 最新 issue 中新增的“新增常用的 JSON 序列化方法” 会导致 AOP 拦截异常 #I3I7VE
    • [答疑] Furion.DatabaseAccessor.PrivateEntityBase 中的 TenantId 数据类型设置为 object #I3IQV6
    • [答疑] 有关异常拦截和处理的疑问 #I3IUFZ
    • [答疑] DataValidation 在空值的情况下被忽略掉了#I3IWSM
    • [答疑] 日志文档没有更新 #I3J1DX
    • [答疑] 对于 webapi 简单类型参数,是否可以以 json 方式提交 #I3J18I
    • [答疑] IUnifyResultProvider 实现中如果 UnifyModel 的 type 不是范型会报错 #I3JBXF
    • [答疑] 如何模块化开发新功能? #I3J7ZZ
    • [答疑] 建议增加微服务中间件的集成 #I3JTZQ
    • [答疑] 二级虚拟目录部署的 swagger 的 MiniProfiler js 报错 #I3IWLR
  • 不做实现

    • [作废] 在请求审计日志中对贴有 DisableAuditing 特性的字段自动过滤 #I3DHAN

v1.19.0 (已发布)

  • 新特性

    • [新增] EFCore 5.0 支持 SqlServer 2005-2008 数据库 #I3HZZ6
    • [新增] Sql 高级代理支持模板替换了 #I3HHWU #I3HH2T
    • [新增] PBKDF2 加密 #I3HN7A
    • [新增] 常用的 JSON 操作方法 #I3HUYO
    • [新增] 所有解析服务的方法都支持传入 IServiceProvidier 参数 #I3HXEU
  • 突破性变化

    • [升级] .NET 5 SDK 至 5.0.5 版本
  • 问题修复

    • [修复] 远程请求 application/x-www-form-urlencoded 自动被转码了 #I3HDPC
    • [修复] ISqlDispatchProxy 调用带返回值的存储过程出错 #I3HISS
    • [修复] 多数据库工作单元异常无法回滚数据 #I3I2KN #I3HYN5
    • [修复] Serilog 日志生成太多文件 #I3I2PN
    • [修复] 1.18.0 版本数据库连接池存在连接泄漏问题 #I3I5KO
    • [修复] Sqlite 提示事务已完成异常 #I3I9F2
  • 其他更改

    • [改进] 视图模板功能,默认支持可枚举泛型类型 #I3GYEE
    • [改进] 开发阶段 MiniProfiler 打印数据库相关信息 #I3I8VQ
    • [改进] EFCore 5.0 未提供 Sqlite 数据库 DataAdapter 的支持 #I3I9FC
  • 文档变化

    • [更新] 数据库上下文、多租户、仓储、日志、序列化等文档。
  • 问答答疑

    • [答疑] 建议 MVC 模式下增加 Furion 的功能 #I3GY4R
    • [答疑] 数据库关联操作 #I3H5QP
    • [答疑] 1.17.5 版本 suagger 无法生成 swagger.json #I3HGPZ
    • [答疑] Serilog 扩展+dll 启动与 swagger 的 MiniProfiler 冲突 #I3HWJM
    • [答疑] Sql 高级代理返回 DataTable 时,结果为空取不到记录 #I3HUWG
    • [答疑] Task.Run 操作数据库问题 #I3HZ9D
  • 不做实现


v1.18.0 (已发布)

  • 新特性

    • [新增] Oracle 11 版本支持 #I3EVL5
    • [新增] Mysql 官方包 MySql.EntityFrameworkCore 支持 #I3E6J1
    • [新增] 全局配置 WebApi 参数 [FromQury]#I3EFYJ
    • [新增] 公开框架底层依赖注入扫描注册拓展 services.AddRisterTypes(types) #I3EIV3
    • [新增] SqlSugar 工作单元特性 #I3EJO5
  • 突破性变化

  • 问题修复

    • [修复] 数据库上下文池一旦有上下文操作失败还数据库上下文出现二次提交数据库的问题 #I3EIJJ
    • [修复] 不同数据库命令参数前缀都添加了 @ 处理 #I3EBJP
    • [修复] 尝试修复事件总线线程安全问题 #I3EGSB #PR236
    • [修复] HttpContextExtensionsSignoutToSwagger 方法无效 #I3EHNQ
    • [修复] 如果动态 WebApi 贴了 [ApiController] 特性后,导致路由参数重复生成 #I3EOQQ
    • [修复] 如果没有任何 webapi 控制器时,文档报错 #I3EVLB
    • [修复] 依赖注入泛型类型注册失败 #I3EX66
  • 其他更改

    • [调整] SqlSugar 拓展库仓储 Context 属性类型未 SqlSugarClient #I3EHXA
    • [改进] 刷新 Token 黑名单 Redis 中分组 #I3EQWO
    • [改进] 远程请求在请求拦截次发起二次请求导致异常问题 #I3ER71
    • [改进] 多租户默认缓存改为分布式缓存 #I3EXEU
  • 文档变化

    • [更新] 数据库操作文档 #I3E84X
  • 问答答疑

    • [答疑] 如何方便的获取 IDynamicApiController API 产生的 url 和 谓词 #I3ED17
    • [答疑] Code First -执行命令 Add-Migration 遇到了问题 #I3EHD0
    • [答疑] tools v1.16.0 无法生成实体,一直提示 Missing required argument <PROVIDER>. #I3ENZ8
    • [答疑] Authorize 的 Logout 按钮,无法实时请空 token#I3EOF9
  • 不做实现


v1.17.0 (已发布)

  • 新特性

    • [新增] 动态 WebAPI 支持继承基类配置特性 #I3D5PX
    • [新增] 远程请求支持 multipart/form-data 内容类型处理 #I3D7KG
    • [新增] 字符串加密拓展 #I3DHBW
    • [新增] 新增远程请求可直接下载返回值内容转为 string 类型 #I3DIGR
    • [新增] 远程请求地址支持模板引擎 #I3D5Y8
    • [新增] [DataValidation] 错误消息支持 string.Format 操作 #I3E08W
    • [新增] 远程请求 HttpRequestMessage 拓展方法 AppendQueries() 追加更多 query 参数拓展 #I3E3DI
  • 突破性变化

    • [调整] IRepository.AsAsyncEnumerable() 返回值 #I3DIQ1,调整为:rep.AsQueryable().ToListAsync()
  • 问题修复

    • [修复] 数据验证失败后也打印了成功的字段 #I3CVBS
    • [修复] 远程请求配置 contentTypeapplication/x-www-form-urlencoded 无效问题#I3CWBS
    • [修复] 远程请求无法打印完整的请求地址,比如配置了 HttpClient 之后 #I3CY42
    • [修复] 程序启动时排除默认配置文件算法不对,应该采用正则表达式匹配 #I3D9E7
    • [修复] 远程请求成功请求拦截不生效 #I3DOE4
    • [修复] Dapper 拓展数据库切换为 oracle 时,系统找不到指定的文件 Oracle.ManagedDataAccess.Core #I3DYM3
  • 其他更改

    • [改进] 获取 JWT token 信息支持配置 Token 前缀,如 Bearer #I3DJIV
    • [改进] 刷新 Token 黑名单存储方式,将内存缓存调整为分布式缓存 #I3DPBR
  • 文档变化

    • [调整] 远程请求文档 #I3CPJO
  • 问答答疑

    • [答疑] LinqExpression.And 没有 2 个参数的方法 #I3CXKZ
    • [答疑] 异常信息 如何记录到数据库中:) #I3DDGO
    • [答疑] 无键实体选用 IEntityNotKey #I3DWRF
    • [答疑] 根据主键删除一条记录不成功,无错误信息 #I3DWWF
    • [答疑] 如何自定义接口返回格式 #I3DZN6
    • [答疑] DynamicApiController 如何在运行时决定是否公开一个 Action #I3D5UL
    • [答疑] Furion.DatabaseAccessor.DbHelpers 方法:ConvertToDbParameters 是不是应该过滤掉贴 NotMapped 的特性 #I3E2XS
  • 不做实现

    • [废弃] 框架是否提供 ISoftDelete 类似接口 #I3CP93

v1.16.0 (已发布)

  • 新特性

    • [新增] IDGenerator 雪花 ID 算法,感谢 idgenerator 作者提交 PR #PR204 #I3B60S
    • [新增] DbContext 刷新多租户缓存拓展方法 #I39N5U
    • [新增] 自定义配置单个控制器名称规范,如小写路由 #I3A5XL
    • [新增] 获取当前选择区域语言方法 #I3BSDH
  • 突破性变化

    • [升级] .NET 5 SDK 至 5.0.4 版本 #I3ASTL
    • [重构] 远程请求所有功能 #I2LB7M
    • [重构] JSON 序列化功能,提供统一的抽象接口,方便自由替换 JSON#I39GT9
    • [重构] 验证失败返回消息模型及规范化接口验证参数 #I3AFQW
    • [优化] 插件式开发热插拔功能,实现动态加载卸载 #PR200, 感谢 @SamWangCoder
    • [移除] 移除 JsonSerializerUtility 静态类及移除属性大写序列化拓展配置 #I3AFRJ
  • 问题修复

    • [修复] MVC 模式下不支持验证自定义验证逻辑 #I39LM5
    • [修复] 验证数值类型正则表达式不支持负数 bug #I39YUV
    • [修复] 框架启动时无法加载未被引用的程序集 bug #I3A3Z4
    • [修复] EFCoreRepository.IsAttached() 方法判断错误 bug #I3A824
    • [修复] 动态API 驼峰显示配置无效 bug #I3AF32
    • [修复] cli.ps1 不支持新版本 EFCore bug #I3APO9
    • [修复] EFCore 实体配置 [Table] 特性无效 bug #I3BAYH
    • [修复] 动态 WebAPI CheckIsSplitCamelCase bug #I3BLKX
    • [修复] 修复动态 WebAPI 配置保留 Action 的 Async 后缀无效问题 #I3C3DA
    • [修复] JWT Token 刷新后旧的刷新 Token 依旧可用 bug #I3C8ZH
    • [修复] 多语言 Razor 视图变量多语言乱码问题 #I3CBMU
  • 其他更改

    • [优化] 默认序列化提供器 System.Text.Json 反序列化字符串时区分大小写问题 #I3BSXV
    • [优化] 优化 MessageCenter 性能问题 #I39PRR
    • [优化] 数据库上下文池小性能优化
  • 文档变化

    • [新增] Docker 环境下自动化部署 #PR209
    • [新增] JSON 序列化 文档 #I3B6D8
    • [更新] 跨域、安全授权、即时通信文档、多语言、规范化文档
  • 问答答疑

    • [答疑] Furion.Extras.DatabaseAccessor.SqlSugar 配置多个数据库打印 SQL 语句问题 #I39PDC
    • [答疑] ORACLE 数据库多租户模式下返回值为指定类型时系统卡死 #I39RNH
    • [答疑] 假删除指向异常 #I39XZA
    • [答疑] Furion 多语言配置节是放在 AppSettings 里面还是外面呢? #I3A4SB
    • [答疑] 没找到数据库上下文 #I3A5HS
    • [答疑]QQ 交流群吗? #I3AAM7
    • [答疑] Vue3 环境下配置 SignalR 跨域出错 #I3ALQ7
    • [答疑] 设置 Swagger 参数非必填 #I3AT02
    • [答疑] EFCore 调用 Insert 时报 Unknown column 'Discriminator' in 'field list' 异常 #I3B2LC
    • [答疑] 逆向 mysql 数据库时 cli 出现错误 #I3B64F
    • [答疑] Sql 高级代理使用过程中 DateTime 类型的参数序列化失败 #I3AZXK
    • [答疑] 使用 Mysql 执行 Add-Migration 报错 #I3B8EW
    • [答疑] Saas 多租户模式-独立 Database 模式下无法获取 Tenant, 导致无法自动切换的问题#I3AVXU
    • [答疑] 如何自定义 WebAPI 统一结果模型 #I3BBYW #I3BBYV
    • [答疑]Web.Entry 项目新建了一个 Controller,多了未知方法 #I3BKH5
    • [答疑] AOP 拦截如何解析服务 #I3BUM3
    • [答疑] 动态 WebAPI 返回参数被省略 #I3C2XR
    • [答疑] 如何设置某一个接口响应数据不自动转小写,按原始字段名返回 #I38L9B
    • [答疑] code first 如何配置自动迁移 #I3CCR0
    • [答疑] webapi 混合授权如何区分不同系统 #I3CJCY
    • [答疑] EFCore 不支持递归无限级遍历关系 #I3CET9
  • 不做实现

    • [废弃] 建议 EFCore 可配置外键关系导航问题 #I3994X
    • [废弃] 建议将 EFCore 剥离出来,作为插件的形式提供。这样可以选择自己喜欢的 ORM #I3ABNX
    • [废弃] 事件总线能否提供返回值 #I3AWL6
    • [废弃] Sql 模板能仿照 Mybatis 一样加各种标签吗?#I3ASRS
    • [废弃] EFCore 更新或排除更新指定列支持传入 DTO 模型 #I3AS5K
    • [废弃] 新增 UnitOfWork 事务完成事件 #I3BRMI

v1.15.0 (已发布)

  • 新特性

    • [新增] 跳过特定实体数据库操作监听特性 #I386LB
    • [新增] IEntityChangedListener 增加对 OldEntity 的支持 #I385X2
    • [新增] 实时通信自动配置集线器拓展及特性 #I387QX
    • [新增] Mapster 拓展支持 IMapper 依赖注入方式 #I38C7C
    • [新增] [AppDbContext] 特性默认构造函数 #I38J97
    • [新增] UnifyContext.GetExceptionMetadata(context) 返回错误码支持 #I38ONX
  • 突破性变化

  • 问题修复

    • [修复] 多次循环中调用 Db.GetNewDbContext() 还是获取到同一个对象 #I38NNP
    • [修复] Swagger 过滤掉 object 类型属性问题 #I38FHL
    • [修复] 同一类不支持多继承 IEntityChangedListener 问题 #I38UQJ
    • [修复] 自定义序列化属性名称导致验证失败属性不匹配问题 #I38W8Z
  • 其他更改

    • [优化] 代码不规范命名导致开发者阅读代码时产生歧义
  • 文档变化

    • [新增] FluentValidation 集成文档 #I38IOT
  • 问答答疑

    • [答疑] Furion 框架版本向下兼容问题 #I38WMZ
  • 不做实现

    • [废弃] 建议 SqlSugar 添加动态切换数据库功能 #I38G4M
    • [废弃] 建议 MessageCenter 采用 Channel 实现 #I38BP8
    • [废弃] 建议接口文档整合 Knife4jUI 或 Redoc #I38S70

v1.14.0(已发布)

  • 新特性

    • [新增] EFCore 5.0 的 Oracle 数据库支持 #I37Z8E
    • [新增] 控制是否在开发环境下显示数据库连接信息 #I37YQ2
    • [新增] [NonUnify] 支持在类中贴此特性 #I359Q6
    • [新增] 网络请求 字符串 HttpClient 拦截器 #I35F3E
    • [新增] HttpContextHttpRequest 获取远程地址拓展 #I3688Z
    • [新增] services.AddMvcFilter<> 添加 Mvc 过滤器拓展 #I368BH
  • 突破性变化

    • [升级] 框架依赖的 .NET 5 SDK 至最新版 5.0.3 #I37YQQ
    • [升级] Swashbuckle.AspNetCore 组件包到 6.0.x 版本 #I37EZK
    • [移除] Furion 框架 JWT 拓展类,只在 Furion.Extras.Authentication.JwtBearer 中保留 #I35D59
  • 问题修复

    • [修复] 传入错误 JWT Token 字符串导致自动刷新 Token 出现字符串边界值异常 bug #I34ZE5
    • [修复] 瞬时作用域数据库上下文也会自动加入工作单元导致写日志时连锁异常 bug #I37WTV
  • 其他更改

    • [优化] 获取系统环境参数的性能 #I36SR5
    • [优化] Furion 底层添加 Mvc 过滤器代码 #I36SKA
    • [优化] 添加默认 Json 序列化时间默认时间格式 #I36SL0
    • [升级] 升级 SqlSugar 拓展包到 5.0.2.6 版本 #I36SIG
  • 文档变化

    • [新增] 数据库入门文档 #I37Z8S
    • [新增] 更新日志文档 #I36PI0
    • [新增] 请求审计日志、执行 Sql 更新日志文档 #I36PIK
    • [新增] 前端使用 axios 跨域配置文档 #I36PIT
    • [新增] App 静态类获取应用、环境更多信息数据 #I36SOV
    • [新增] 英文版 README.md 介绍 #I37QHP
  • 问答答疑

  • 不做实现

    • [废弃] 多语言资源文件自动创建 #I35AA4
    • [废弃] 建议多语言加上维吾尔语支持 #I37X1L

v1.13.0(已发布)

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃]SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃]List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/dotnetchina/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furion.icu
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
演练场