Skip to content

Releases: MonkSoul/Furion

v2.19.0

23 Sep 03:13
Compare
Choose a tag to compare
  • 新特性

    • [新增] 定时任务监听器 ISpareTimeListener #I468Q1
    • [新增] 执行 Sql 支持 JsonElement 参数 61985d6
    • [新增] Swagger 配置枚举及标签排序过滤器 #I46LON !404
    • [新增] 远程请求 application/octet-stream 类型默认支持 d9bad03
  • 问题修复

    • [修复] 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

v2.18.0

18 Aug 06:33
Compare
Choose a tag to compare

v2.17.0

09 Aug 10:26
Compare
Choose a tag to compare
  • 新特性

    • [新增] 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.0

30 Jul 06:20
Compare
Choose a tag to compare
  • 新特性

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

    • [调整] 规范化结果 IUnifyResultProvider 参数 (破坏性更改) #I427Z2
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.0

23 Jul 05:45
Compare
Choose a tag to compare
  • 新特性

    • [新增] Db.GetDbRepository<定位器>() 静态方法 #I41MZP
    • [新增] 远程请求缺省序列化配置选项 #I41PBW
    • [新增] MVC 控制器支持规范化处理 #I427Z2
  • 突破性变化

    • [调整] 规范化结果 IUnifyResultProvider 参数 (破坏性更改) #I427Z2

新版本自定义规范化结果

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="options"></param>
        /// <returns></returns>
        public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultStatusCodesOptions options)
        {
            // 设置响应状态码
            UnifyContext.SetResponseStatusCodes(context, statusCode, options);

            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()
            };
        }
    }
}
  • 问题修复

    • [修复] 自动扫描接口进行依赖注入获取首个接口错误 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.14.0

18 Jul 03:57
Compare
Choose a tag to compare
  • 新特性

    • [新增] 简易字符串模板功能,支持远程请求、数据库模块、日志模块、事件总线模块、定时任务模块、异常模块、数据校验模块 #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.13.0

13 Jul 05:25
Compare
Choose a tag to compare
  • 新特性

    • [新增] 简易字符串模板功能,支持远程请求、数据库模块、日志模块、事件总线模块、定时任务模块、异常模块、数据校验模块 #I402BL
    • [新增] 404 状态码规范化默认处理 #I408F5
  • 突破性变化

    • [移除] Db.GetNewDbContext() 静态方法 #I400BK
    • [移除] 数据库模块时态表拓展支持 #I405HI
    • [调整] IJsonSerializerProvider 接口参数,新增 inherit 参数 #I3ZQU5
  • 问题修复

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

v2.12.0

07 Jul 07:29
Compare
Choose a tag to compare

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
  • 突破性变化

    • [移除] FakeDelete 假删除/软删除所有功能 #I3XKII
    • [移除] 移除 PBKDF2 加密算法 #I3Z0IO
    • [调整] [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
    • [修复] 继承 Serlig 日志在 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.11.0

01 Jul 10:21
Compare
Choose a tag to compare

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

  • 新特性

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

    • [移除] FakeDelete 假删除/软删除所有功能 #I3XKII
    • [调整] [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
    • [修复] 继承 Serlig 日志在 Worker Service 生成重复日志 bug #I3WA0L !331
    • [修复] 粘土对象 动态添加 Clay 类型 bug #I3W9LW
    • [修复] ValidationTypes.Numeric 校验数值类型正则表达式错误 #I3WADS
    • [修复] 数据库命令参数 DbParameterValueobject 类型的时候且不指定 #I3YKM6
  • 其他更改

    • [增强] 支持 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
  • 不做实现

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

v2.10.0

24 Jun 03:43
Compare
Choose a tag to compare

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

  • 新特性

    • [新增] app.UseUnifyResultStatusCodes() 可配置修改返回状态码 #I3VZQH
    • [新增] 远程请求添加默认 User-Agent#I3W17C
    • [新增] 支持 Sql 高级代理切换数据库上下文定位器 #I3XFP6 #I3XDCR
  • 突破性变化

    • [移除] FakeDelete 假删除/软删除所有功能 #I3XKII
    • [调整] [NonAutomatic] 特性名称为 [Manual] #I3XKKX
    • [调整] [NotChangedListener] 特性名称为 [SuppressChangedListener] #I3XKLZ
    • [调整] [ManualSaveChanges] 名称为 [ManualCommit] #I3XKNP
    • [调整] DbContext.TenantIdQueryFilterExpression 名称为 DbContext.BuildTenantQueryFilter #I3XKTB
    • [重构] Sql 执行,性能提升 20% #I3W33U
  • 问题修复

    • [修复] 继承 Serlig 日志在 Worker Service 生成重复日志 bug #I3WA0L !331
    • [修复] 粘土对象 动态添加 Clay 类型 bug #I3W9LW
    • [修复] ValidationTypes.Numeric 校验数值类型正则表达式错误 #I3WADS
  • 其他更改

    • [移除] 框架无用代码、优化代码
    • [优化] Furion非 Web 环境下性能
  • 文档变化

    • [更新] 远程请求、日志、数据库上下文、远程请求文档
  • 问答答疑

    • [答疑] dapper 多个数据源如何继承 #I3WUOI
    • [答疑] 关于 SpareTime 多次执行问题#I3XEQU
  • 不做实现

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