Releases: MonkSoul/Furion
Releases · MonkSoul/Furion
v2.19.0
-
新特性
-
问题修复
- [修复]
Scoped.Create
在EFCore
进行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
v2.17.0
-
新特性
- [新增]
IPC(Inter-Process Communication,进程间通信)
模块功能,目前提供进程内通信和共享内存进程外通讯 ProcessChannel - [新增] 远程请求
application/xml
和text/xml
默认支持 4753a1a - [新增] 控制台全局异常拦截 4a4fe1f
- [新增] 支持自定义
.json
配置文件扫描目录 3e2910a - [新增] 支持数据库实体接口显式实现接口配置 9610a0a
- [新增] 控制台应用程序全局拦截
[IfException]
支持 4a4fe1f - [新增] 依赖注入模块接口可以限制实现类生存周期,实现类也支持复写生存周期 d2ce089
- [新增]
-
突破性变化
-
问题修复
-
其他更改
- [调整] Swagger 生成泛型 SchemaIds 默认连接符,由
Of
改为_
81946b6
- [调整] Swagger 生成泛型 SchemaIds 默认连接符,由
v2.16.0
-
新特性
-
突破性变化
- [调整] 规范化结果
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
-
新特性
-
突破性变化
- [调整] 规范化结果
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()
};
}
}
}
-
问题修复
-
其他更改
- [优化] 系统启动性能,从 106M 减少到 84M
- [优化] 大量底层代码,包大小从 391Kb 减少到 350Kb(不带注释版本仅 64Kb)
v2.14.0
-
新特性
-
突破性变化
-
问题修复
-
其他更改
v2.13.0
-
新特性
-
突破性变化
-
问题修复
v2.12.0
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 - [新增]
DataTable
和DataSet
支持不指定强类型返回 #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 - [修复] 数据库命令参数
DbParameter
的Value
是object
类型的时候且不指定 #I3YKM6 - [修复]
Oracle
数据库存储过程游标参数
报错问题 #I3ZBYE - [修复]
Worker Services
采用独立发布后无法执行问题 #I3ZH3X - [修复] 修复远程请求如果无返回值序列化异常问题 !348
-
其他更改
-
文档变化
-
问答答疑
- [答疑]
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
该版本有多个破坏性更改,更新时请认真查看。
-
新特性
- [新增]
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 - [修复] 数据库命令参数
DbParameter
的Value
是object
类型的时候且不指定 #I3YKM6
-
其他更改
-
文档变化
-
问答答疑
- [答疑]
dapper
多个数据源如何继承 #I3WUOI - [答疑] 关于
SpareTime
多次执行问题#I3XEQU - [答疑] 选项更改通知(热更新):数据库里的数据更改了如何通知选项进行改变? #I3XYI8
- [答疑]
SaaS
多租户添加时无法获取租户Id
#I3Y5CF - [答疑] 获取
_httpContextAccessor.HttpContext
为空#I3Y6BI - [答疑]
Ubuntu
中使用App.Configuration
方法读取不到值 #I3Y74H - [答疑] 数据库上下文作用域问题 #I3YHXP
- [答疑] 使用
UnitofWork
提交事务,可以提交成功,但是系统会有错误 #I3YIWU
- [答疑]
-
不做实现
- [废弃]
SpareTIme
新增Dashboard
控制台看板,同时可以对任务进行暂停、删除、查看#I3XELY
- [废弃]
v2.10.0
该版本有多个破坏性更改,更新时请认真查看。
-
新特性
-
突破性变化
- [移除]
FakeDelete
假删除/软删除所有功能 #I3XKII - [调整]
[NonAutomatic]
特性名称为[Manual]
#I3XKKX - [调整]
[NotChangedListener]
特性名称为[SuppressChangedListener]
#I3XKLZ - [调整]
[ManualSaveChanges]
名称为[ManualCommit]
#I3XKNP - [调整]
DbContext.TenantIdQueryFilterExpression
名称为DbContext.BuildTenantQueryFilter
#I3XKTB - [重构]
Sql
执行,性能提升 20% #I3W33U
- [移除]
-
问题修复
-
其他更改
- [移除] 框架无用代码、优化代码
- [优化]
Furion
在非 Web
环境下性能
-
文档变化
- [更新] 远程请求、日志、数据库上下文、远程请求文档
-
问答答疑
-
不做实现
- [废弃]
SpareTIme
新增Dashboard
控制台看板,同时可以对任务进行暂停、删除、查看#I3XELY
- [废弃]