发布 Furion
和 Furion.Tools
和 Furion.Xunit
v4.8.7
版本,适配 .NET8 Preview.1
。
https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-1/
新特性
SyncRate
功能 4.8.7.43 ⏱️2023.04.12 703b465Serve.GetIdleHost([host])
静态方法,可获取一个指定主机的 Web
地址(端口) 4.8.7.43 ⏱️2023.04.12 fdf788Key
时是抛异常还是返回 null
4.8.7.40 ⏱️2023.04.10 e994d53RequestPath
入口地址功能 4.8.7.34 ⏱️2023.04.04 24736f6App.GetServices(type)
和 App.GetServices<T>()
获取服务实例集合 4.8.7.33 ⏱️2023.04.03 c3e9957[HttpMethod]ToSaveAsync
下载远程文件并保存到磁盘方法 4.8.7.32 ⏱️2023.04.02 bfd02c1.AlterTo
修改作业触发器触发时间便捷方法 4.8.7.31 ⏱️2023.03.31 0349017DateTime
时间格式化配置节点 DateTimeFormatCulture
4.8.7.31 ⏱️2023.03.31 #I6RUOUServe.IdleHost
静态属性,可获取一个随机空闲 Web
主机地址(端口) 4.8.7.29 ⏱️2023.03.30 e425063WinForm/WPF
静态方法 Serve.RunNative()
可配置是否启用 Web
主机功能 4.8.7.26 ⏱️2023.03.29 #I6R97LWinForm/WPF
支持依赖注入的 Native.CreateInstance<T>()
静态方法 4.8.7.23 ⏱️2023.03.27 53d51c3WinForm/WPF
快速注册静态方法:Serve.RunNative()
4.8.7.23 ⏱️2023.03.27 53d51c3Content-Type
为 text/html
和 text/plain
处理 4.8.7.22 ⏱️2023.03.27 #I6QMLRIEnumerable<T>
对象并实现 Lambda/Linq
操作 4.8.7.19 ⏱️2023.03.22 2b14ed9Crontab.IsValid(...)
静态方法,判断 Cron
表达式是否有效 4.8.7.17 ⏱️2023.03.20 #I6OHO4WithStackFrame
,可控制是否输出产生日志的程序集,类型和具体方法 4.8.7.16 ⏱️2023.03.19 5ad6ae2UI
作业列表 最近执行时间
列和优化显示效果 4.8.7.12 ⏱️2023.03.15 26462a8 cb5dd17RunJob
方法 4.8.7.11 ⏱️2023.03.15 #I6LD9XUI
提供立即执行功能 4.8.7.11 ⏱️2023.03.15 #I6LD9XHttpRequestMessage
拓展方法 AppendHeaders
4.8.7.10 ⏱️2023.03.14 #I6MVHTJobExecutionContext
服务提供器 ServiceProvider
属性 4.8.7.10 ⏱️2023.03.14 02586f8HTTP
作业,支持定时请求互联网 URL
地址 4.8.7.7 ⏱️2023.03.11 01d4466Trigger
执行结果 Result
和执行耗时 ElapsedTime
属性 4.8.7.7 ⏱️2023.03.11 01d4466Result
和执行耗时 ElapsedTime
属性 4.8.7.7 ⏱️2023.03.11 01d4466Sql
高级拦截支持返回 IEnumerable<T>
和 T[]
类型值 4.8.7.5 ⏱️2023.03.07 f2ca2d3.m3u8
和 .ts
文件类型 MIME
支持 4.8.7.5 ⏱️2023.03.07 #I6KKEMLoggingMonitor
支持对参数贴 [SuppressMonitor]
特性跳过记录 4.8.7.3 ⏱️2023.03.01 #I6IVGWLoggingMonitor
监听 TraceId
、ThreadId
、Accept-Language
4.8.7.1 ⏱️2023.02.27 df35201UnifyContext.GetSerializerSettings(string)
静态方法 4.8.7.1 ⏱️2023.02.27 #I6HM7T突破性变化
DynamicJob
委托/方法签名 4.8.7.10 ⏱️2023.03.14 6d56b53.NET8 Preview.1
4.8.7 ⏱️2023.02.22.NET8 Preview.1
项目 4.8.7 ⏱️2023.02.22问题修复
Cookies
时如果包含相同 Key
异常问题 4.8.7.44 ⏱️2023.04.12 #I6V3T7Dictionary<string, object>
类型异常 4.8.7.41 ⏱️2023.04.11 f96baebTP.Wrapper
静态类不能准确识别多行内容问题 4.8.7.40 ⏱️2023.04.10 #I6UAC8Key
键 4.8.7.39 ⏱️2023.04.10 6572515Id
删除作业不能删除作业触发器问题 4.8.7.35 ⏱️2023.04.05 312ca35WebAPI
去除叠词类型命名如 ServiceService
前后缀异常问题 4.8.7.32 ⏱️2023.04.02 #I6SB3Z4.8.7.22
版本导致动态 WebAPI
类型注释丢失问题 4.8.7.27 ⏱️2023.03.29 #I6QM234.8.7.19
版本更新导致异常 4.8.7.25 ⏱️2023.03.28 #I6R4ZUSwagger UI
不显示 ControllerBase
派生类注释 4.8.7.22 ⏱️2023.03.27 #I6QM23JSON
格式漏掉了 UseUtcTimestamp
和 TraceId
键值 4.8.7.21 ⏱️2023.03.27 5c90e65WebSocket
连接断开时出现异常 4.8.7.20 ⏱️2023.03.23 #I6PI5E积压:0
和 归档:6
时调用立即执行后不能恢复上一次状态 4.8.7.18 ⏱️2023.03.21 6f5aae8sql
不能自动修复命令参数前缀 4.8.7.18 ⏱️2023.03.21 #I6OK4TCron
表达式 *
符号解析器不够严谨,如:*1111aaaaa
也被解析为 *
4.8.7.17 ⏱️2023.03.20 #I6OHO4null
值默认被跳过问题 4.8.7.17 ⏱️2023.03.20 #I6OHO4(object)model
类型 4.8.7.16 ⏱️2023.03.19 #I6O3BDBody
重复读且在授权之前读取导致非 GET/HEAD/OPTION
请求异常 4.8.7.15 ⏱️2023.03.19 #I6NX9ESQL
语句没有处理 '
转义问题 4.8.7.15 ⏱️2023.03.19 #I6NXKAValiationTypes.GUID_OR_UUID
不支持大写问题 4.8.7.14 ⏱️2023.03.16 #I6NP22Blazor
脚手架出现 blazor.server.js
不能加载问题(404
) 4.8.7.13 ⏱️2023.03.16 #I6NOBQ30秒
问题 4.8.7.8 ⏱️2023.03.13 #I6MI9I #I6MHOU\n
换行符对齐问题 4.8.7.6 ⏱️2023.03.10 759bcc5LoggingMonitor
对特定参数贴有 [FromServices]
特性依旧记录问题 4.8.7.3 ⏱️2023.03.01 17b134eSwagger
接口排序同时指定 Tag
和 Order
之后无效 4.8.7.2 ⏱️2023.03.01 #I6IQDI #I6IP66其他更改
Blazor
+ WebAPI
脚手架模板,默认添加授权支持 4.8.7.37 ⏱️2023.04.07 #I6OM8O 544f80dapp.UseAppLocalization()
添加 Action<options>
委托参数 4.8.7.30 ⏱️2023.03.31 #I6RUOUHttp
作业 HttpMethod
属性拼写错成 HttpMedhod
4.8.7.24 ⏱️2023.03.28 !756number
类型处理,若含 .
转 double
类型,否则转 long
类型 4.8.7.24 ⏱️2023.03.28 e82e883System.Collections
程序集 4.8.7.16 ⏱️2023.03.18 #I6O3BDBuilSqlType
属性命为 BuildSqlType
4.8.7.11 ⏱️2023.03.15 92117b810条
改为 5条
4.8.7.7 ⏱️2023.03.07 01d4466MIME
支持 4.8.7.5 ⏱️2023.03.07 e35cdabLoggingMonitor
返回值泛型字符串显示格式 4.8.7.1 ⏱️2023.02.27 df35201文档
WebAPI
文档、日志记录文档、事件总线文档、虚拟文件系统文档、Sql
高级代理文档、数据库实体文档、任务队列文档、跨域文档、配置选项文档、安全授权、脚手架文档、粘土对象文档、多语言文档贡献者
1. LoggingMonitor
支持跳过特定参数记录
在 Furion 4.8.7.3+
版本新增 [SuppressMonitor]
特性支持标记参数(支持类型,方法)不被记录,如:
[LoggingMonitor]
public string GetName([SuppressMonitor]SomeType type, int id) // type 参数将跳过记录
{
return nameof(Furion);
}
2. Sql
高级代理支持 IEnumerable<T>
、T[]
和 Tuple<(IEnumerable<T>, T[], T, List<T>)
混合返回值
public interface ISql : ISqlDispatchProxy
{
[SqlExecute("select * from person where id = @id")]
Person GetPerson(int id);
[SqlExecute("select * from person where id = @id")]
Task<Person> GetPersonAsync(int id); // 异步
// ----------------------------------------
[SqlExecute("select * from person")]
List<Person> GetPersons();
[SqlExecute("select * from person")]
Task<List<Person>> GetPersonsAsync(); // 异步
// ----------------------------------------
[SqlExecute("select * from person")]
Person[] GetPersons();
[SqlExecute("select * from person")]
Task<Person[]> GetPersonsAsync(); // 异步
// ----------------------------------------
[SqlExecute("select * from person")]
IEnumerable<Person> GetPersons2();
[SqlExecute("select * from person")]
Task<IEnumerable<Person>> GetPersons2Async(); // 异步
// ----------------------------------------
// 更复杂的组合
[SqlExecute(@"
select * from person where id = 1;
select * from person;
select * from person where id > 0;
select * from person where id > 0;
")]
(Person, List<Person>, Person[], IEnumerable<Person>) GetPersons();
// 更复杂的组合
[SqlExecute(@"
select * from person where id = 1;
select * from person;
select * from person where id > 0;
select * from person where id > 0;
")]
Task<(Person, List<Person>, Person[], IEnumerable<Person>)> GetPersonsAsync(); // 异步
}
3. 定时任务支持 Http
作业
HTTP
请求作业通常用于定时请求/访问互联网地址。
services.AddSchedule(options =>
{
options.AddHttpJob(request =>
{
request.RequestUri = "https://www.chinadot.net";
request.HttpMedhod = HttpMethod.Get;
// request.Body = "{}"; // 设置请求报文体
}, Triggers.PeriodSeconds(5));
});
作业执行日志如下:
info: 2023-03-11 11:05:36.3616747 +08:00 星期六 L System.Logging.ScheduleService[0] #1
Schedule hosted service is running.
info: 2023-03-11 11:05:36.3652411 +08:00 星期六 L System.Logging.ScheduleService[0] #1
Schedule hosted service is preloading...
info: 2023-03-11 11:05:36.5172940 +08:00 星期六 L System.Logging.ScheduleService[0] #1
The <job1_trigger1> trigger for scheduler of <job1> successfully appended to the schedule.
info: 2023-03-11 11:05:36.5189296 +08:00 星期六 L System.Logging.ScheduleService[0] #1
The scheduler of <job1> successfully appended to the schedule.
warn: 2023-03-11 11:05:36.5347816 +08:00 星期六 L System.Logging.ScheduleService[0] #1
Schedule hosted service preload completed, and a total of <1> schedulers are appended.
warn: 2023-03-11 11:05:41.5228138 +08:00 星期六 L System.Logging.ScheduleService[0] #15
Schedule hosted service will sleep <4970> milliseconds and be waked up at <2023-03-11 11:05:46.486>.
info: 2023-03-11 11:05:41.5542865 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.LogicalHandler[100] #9
Start processing HTTP request GET https://www.chinadot.net/
info: 2023-03-11 11:05:41.5589056 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.ClientHandler[100] #9
Sending HTTP request GET https://www.chinadot.net/
info: 2023-03-11 11:05:44.1305461 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.ClientHandler[101] #8
Received HTTP response headers after 2566.7836ms - 200
info: 2023-03-11 11:05:44.1343977 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.LogicalHandler[101] #8
End processing HTTP request after 2584.2327ms - 200
info: 2023-03-11 11:05:48.6475959 +08:00 星期六 L System.Logging.ScheduleService[0] #4
Received HTTP response body with a length of <63639> output as follows - 200
<!DOCTYPE html><html><head>
<title>dotNET China | 让 .NET 开发更简单,更通用,更流行</title>
......
</body></html>
4. 调整定时任务动态作业 DynamicJob
委托/方法签名
为了统一动态作业和普通作业的 ExecuteAsync
方法签名,故做出调整。
由:
options.AddJob((serviceProvider, context, stoppingToken) =>
{
serviceProvider.GetLogger().LogInformation($"{context}");
return Task.CompletedTask;
}, Triggers.PeriodSeconds(5));
调整为:
options.AddJob((context, stoppingToken) =>
{
context.ServiceProvider.GetLogger().LogInformation($"{context}");
return Task.CompletedTask;
}, Triggers.PeriodSeconds(5));
5. 远程请求 HttpRequestMessage
拓展方法 AppendHeaders
如需动态设置,可使用以下方式(添加参数拦截拦截器):
public interface IHttp : IHttpDispatchProxy
{
// 通过参数拦截
[Post("https://furion.baiqian.ltd/post")]
Task<HttpResponseMessage> PostXXXAsync(string name, [Interceptor(InterceptorTypes.Request)] Action<HttpClient, HttpRequestMessage> action = default);
}
调用:
_http.PostXXXAsync("百小僧", (client, requestMessage) =>
{
requestMessage.AppendHeaders(new Dictionary<string , object> {
{ "Authorization", "Bearer 你的token"},
{ "X-Authorization", "Bearer 你的刷新token"}
});
// 也支持对象,匿名方式
requestMessage.AppendHeaders(new {
Authorization = "Bearer 你的token",
Others = "其他"
});
// 也可以使用原生
requestMessage.Headers.TryAddWithoutValidation("Authorization", "Bearer 你的token");
requestMessage.Headers.TryAddWithoutValidation("key", "value");
});
6. 定时任务立即执行方法
// 带返回值
var scheduleResult = _schedulerFactory.TryRunJob("job1");
// 不带返回值
_schedulerFactory.RunJob("job1");
7. 粘土对象可转换成 IEnumerable<T>
对象并实现 Lambda/Linq
操作
dynamic clay = Clay.Parse("{\"Foo\":\"json\",\"Bar\":100,\"Nest\":{\"Foobar\":true},\"Arr\":[\"NOR\",\"XOR\"]}");
// 将 clay.Arr 转换成 IEnumerable<dynamic>
IEnumerable<dynamic> query = clay.Arr.AsEnumerator<dynamic>();
// 实现 Lambda/Linq 操作
var result = query.Where(u => u.StartsWith("N"))
.Select(u => new
{
Name = u
})
.ToList();
2023年02月22日(今日),微软发布了 .NET8 Preview.1
版本,花了 4
个小时将 Furion
进行升级适配,解决了 3
处破坏性更改,11
处代码适配调整,超 9000
个单元测试 100%
测试通过。
从今日开始,任何 Furion 版本(v0.x,v1.x,v2.x,v3.x,v4.x)都可以直接升级到最新版 v4.8.7,应用层无任何破坏性更改,底层全部做了兼容处理。
同时 Furion v5 彻底无依赖版本也做出相应调整,直接 .NET8 起步。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
预告 v4
版本最后一个新模块:👍邮件发送👍,将在下一个次版本 v4.8.8
发布。
邮件发送几乎是所有应用系统都必备的功能,过去大家都使用第三方 Mailkit
或者 FluntMail
等第三方模块。所以慎重考虑后,Furion
决定自己写邮件发送功能,不断迭代至完善,这样功能完全可控,出问题第一时间修复,想要什么功能就可以搞。
Furion
已经内置了很多系统必备的模块了,比如日志模块,定时任务模块,模板引擎模块等等,再也不用使用第三方了。😊
功能必须自主可控是 Furion
的初心,v5
版本将实现彻彻底底无第三方依赖,自己写 Swagger
,自己写 Mapper
。
没了第三方,就不用等第三方更新了,只有我的速度才能跟上你们项目迭代的速度,不加班是我们的倔强。
2023年03月15日,.NET 8 Preview 2
,.NET 7.0.5
,.NET6.0.15
发布
https://devblogs.microsoft.com/dotnet/march-2023-updates/
[FromBody]
特性现在支持多个了
Sqlite
支持 JSON
列了
支持 Tree
型查询了(递归)!重大支持
Furion v4.8.7.29
版本发布,支持 Web
项目发布成 WinForm/WPF
桌面应用程序啦,类似前端 Electron
和 Tauri
技术
登录 后才可以发表评论
FileDragTip