forked from MonkSoul/Furion
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCHANGELOG.md
1658 lines (1237 loc) · 118 KB
/
CHANGELOG.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
> 版本号规则:`主版本号.次版本号.修订版本号`
>
> - 只要确认为框架 `bug`,则当天修复,当天发版,修订版本号 `加 1`。
> - 只要 `.NET SDK` 版本更新,则当天升级,当天发版,修订版本号 `加 1`。
> - 如果 `.csproj` 文件有变更,则当天发版,修订版本号 `加 1`。
> - 如果新增 `拓展包`,为了版本号统一,则当天发版,修订版本号 `加 1`。
> - 如果涉及到代码重构,则当天发版,次版本号 `加 1`,修订版本号 `清 0`。
> - 如果 `.NET SDK` 主版本号升级,则当天发版,主版本号 `加 1`。
## v3.0.0(当前版本)
> **Furion v3.x 版本采用 .NET6 构建。**
- **突破性变化**
- [升级] 全面支持 `.NET6` 版本
- **文档**
- [文档] 查看 **[.NET6 一分钟入门](https://dotnetchina.gitee.io/furion/docs/get-start-net6)**
- [文档] 查看 **[Furion v2 升级 v3](https://dotnetchina.gitee.io/furion/docs/net5-to-net6)**
---
## v2.20(已发布)
- **突破性变化**
- [重构] `EventBus` 模块,采用 [Jaina](https://gitee.com/dotnetchina/Jaina) 方式
- **问题修复**
- [修复] 远程请求上传文件异常 [0c0752](https://gitee.com/dotnetchina/Furion/commit/0c0752c624799d7d3c7661a8f36a93983399bb59)
- [修复] 框架启动不支持环境变量 `ASPNETCORE_HOSTINGSTARTUPASSEMBLIES` 配置 [!438](https://gitee.com/dotnetchina/Furion/pulls/438)
- [修复] 定时任务内存和CPU占用及特殊情况下空异常问题 [12c65de](https://gitee.com/dotnetchina/Furion/commit/12c65debf552c57780679e6a567a9dd9fb077f46)
- [修复] 默认控制器启用规范化结果无效 bug[c7a4a5e](https://gitee.com/dotnetchina/Furion/commit/c7a4a5ef8c3282d245cbe04124cf379d381d496f)
- [修正] 依赖注入 `InjectionAttribute` 特性的 `ExceptInterfaces` 单词拼写错误问题 [!436](https://gitee.com/dotnetchina/Furion/pulls/436)
- **其他更改**
- [优化] `InjectionAttribute` 代码 [!435](https://gitee.com/dotnetchina/Furion/pulls/435)
- **文档**
- [新增] 事件总线新文档
---
## v2.19(已发布)
- **新特性**
- [新增] 定时任务监听器 `ISpareTimeListener` [#I468Q1](https://gitee.com/dotnetchina/Furion/issues/I468Q1)
- [新增] 执行 `Sql` 支持 `JsonElement` 参数 [61985d6](https://gitee.com/dotnetchina/Furion/commit/61985d6a300485d553cbe8461b01f01bcd0936ef)
- [新增] `Swagger` 配置枚举及标签排序过滤器 [#I46LON](https://gitee.com/dotnetchina/Furion/issues/I46LON) [!404](https://gitee.com/dotnetchina/Furion/pulls/404)
- [新增] 远程请求 `application/octet-stream` 类型默认支持 [d9bad03](https://gitee.com/dotnetchina/Furion/commit/d9bad0320cc4a204e24bc3a070517ebce4cdc5d7)
- [新增] 远程请求代理模式请求报文头支持 `IDictionary<string ,object>` 类型。[0204c0a](https://gitee.com/dotnetchina/Furion/commit/0204c0afe2de5c28ebbd44b29131e701b93ae8b8)
- [新增] `MongoDB` 拓展类,添加更多常用操作方法 [!423](https://gitee.com/dotnetchina/Furion/pulls/423)
- [新增] `DateTimeOffset?` 转换 `DateTime` 拓展(包含互换) [!432](https://gitee.com/dotnetchina/Furion/pulls/432)
- **问题修复**
- [修复] `Scoped.Create` 在 `EFCore` 进行 `Add-Migration` 时候报空异常问题,原因是在 `PM` 环境中不存在根服务[0853e74](https://gitee.com/dotnetchina/Furion/commit/0853e74de90718fce9c0892e2ee4da597f62a918)
- [修复] 定时任务执行异常后异常一直驻留内存问题,修正为执行成功自动清空过去异常 [197a62b](https://gitee.com/dotnetchina/Furion/commit/197a62bb4a7df34eb2c0dbda65121e9cf00d905c)
- [修复] `Jwt` 拓展包不正确的代码导致 IOptions 失效[#I46LUP](https://gitee.com/dotnetchina/Furion/issues/I46LUP)
- [修复] `Swagger` 枚举 `Schema` 过滤器不输出值问题 [#I46LON](https://gitee.com/dotnetchina/Furion/issues/I46LON) [!404](https://gitee.com/dotnetchina/Furion/pulls/404)
- [修复] `Swagger` 处理非 `int` 类型枚举转换 bug [#I46QJ9](https://gitee.com/dotnetchina/Furion/issues/I46QJ9)
- [修复] 视图引擎编译模板生成 `dll` 后再次加载出现 `IL` 格式化错误问题 [ff52d38](https://gitee.com/dotnetchina/Furion/commit/ff52d383718b4d34968619f17c9d54d8718b4f3f)
- [修复] 管道 `Channel` 读取器无法释放 `Handler` 对象问题 [10f4a90](https://gitee.com/dotnetchina/Furion/commit/10f4a900ee558a29f40ae21366a0eba83eceb3eb)
- [修复] `Worker Services` 下日志不输出问题 [c482548](https://gitee.com/dotnetchina/Furion/commit/c48254822c09092906ef77f04d54497e27665a92)
- [修复] 远程请求 `multipart/form-data` 类型对接微信小程序上传文件 问题 [d9bad03](https://gitee.com/dotnetchina/Furion/commit/d9bad0320cc4a204e24bc3a070517ebce4cdc5d7)
- [修复] 工作单元上下文在某些情况下共享事务失效问题 [006d439](https://gitee.com/dotnetchina/Furion/commit/006d439de3357d4d58ea6d7d3f9d51771a7b604e)
- [修复] `Swagger` 枚举值在 `GET` 请求中 `Schema` 显示不正确问题 [fb72fd7](https://gitee.com/dotnetchina/Furion/commit/fb72fd7c98de5bf2246dd1bf08200152bd7ab7a0)
- [修复] 远程请求 `404` 不走异常过滤器问题 [!426](https://gitee.com/dotnetchina/Furion/pulls/423)
- [修复] 自定义事件总线并发情况下调用完成后无法正确处理队列数据 [!429](https://gitee.com/dotnetchina/Furion/pulls/429)
- [修复] `v2.19+` 版本之后模块化开发加载外部程序集失效问题 [!433](https://gitee.com/dotnetchina/Furion/pulls/433)
- [修复] 定时任务 SpareTime 频繁检查导致 CPU 增高问题 [aa0a2ee](https://gitee.com/dotnetchina/Furion/commit/aa0a2eec95f6ed2b74c681877498900726267d82)
- **特别鸣谢**
- [YaChengMu](https://gitee.com/YaChengMu)
---
## v2.18(已发布)
- **新特性**
- [新增] 定时任务监听器 `ISpareTimeListener` [#I468Q1](https://gitee.com/dotnetchina/Furion/issues/I468Q1)
- [新增] 执行 `Sql` 支持 `JsonElement` 参数 [61985d6](https://gitee.com/dotnetchina/Furion/commit/61985d6a300485d553cbe8461b01f01bcd0936ef)
- [新增] `Furion.Tools.CommandLine` 拓展库 [查看源码](https://gitee.com/dotnetchina/Furion/tree/master/tools/Furion.Tools/Furion.Tools.CommandLine)
- [新增] 基于 `AsyncLocal<T>` 的 `CallContext` 实现 [9057a21](https://gitee.com/dotnetchina/Furion/commit/9057a212aab8057b668086bd14369fa68ce120df)
- [新增] 远程请求可配置请求移除重试策略 [656da87](https://gitee.com/dotnetchina/Furion/commit/656da87a667c2da7d82425cdcd47146e99602d65)
- [新增] 远程请求 `OnRequestFailded` 事件 [4a3da4b](https://gitee.com/dotnetchina/Furion/commit/4a3da4ba2c69380fe5f8c2fda80054544c0a3468)
- [新增] `Swagger` 配置枚举及标签排序过滤器 [#I46LON](https://gitee.com/dotnetchina/Furion/issues/I46LON) [!404](https://gitee.com/dotnetchina/Furion/pulls/404)
- **突破性变化**
- [移除] `Scoped` 所有带返回值方法 [656da87](https://gitee.com/dotnetchina/Furion/commit/656da87a667c2da7d82425cdcd47146e99602d65)
- [调整] **在 `ConfigureService` 中调用 `App.GetOptions<>()` 获取配置逻辑** [afa4ac3](https://gitee.com/dotnetchina/Furion/commit/afa4ac347152ccac37bd1d0f9af1e8ffb665a662)
> 在过去,很多开发者总是喜欢在 `Startup.cs` 配置服务的 `ConfigureService` 方法中解析服务,这样导致内存存在溢出风险,GC 无法回收。
> 正确的方式是尽可能的避免 `ConfigureService` 中解析服务。**如果需要在【启动时】获取 `配置选项`,请使用 `App.GetConfig<TOptions>(路径, true)` 代替 `App.GetOptions<TOption>`**。
- **问题修复**
- [修复] v2.16+ 版本重构 `AppDbContextBuilder` 之后写错实体类型 [#I45E6M](https://gitee.com/dotnetchina/Furion/issues/I45E6M)
- [修复] 远程请求单个值序列化错误处理方式 [3282eba](https://gitee.com/dotnetchina/Furion/commit/3282eba2cecb505e339ef3f9c8e823f84dcb43f0)
- [修复] v2.17.3+ 单元测试创建 `TestServer` bug [#I45JR3](https://gitee.com/dotnetchina/Furion/issues/I45JR3)
- [修复] `Retry.Invoke` 正常方法死循环 bug [!392](https://gitee.com/dotnetchina/Furion/pulls/392)
- [修复] 刷新 `Token` 生成新 `Token` 存在数组/集合类型导致 `Key` 重复异常问题 [aeea2b1](https://gitee.com/dotnetchina/Furion/commit/aeea2b1b19434f3171bd1c77be057ca36ecf9be2)
- [修复] 远程请求序列化引用类型对象(不含 `string`)不正确的处理 [93cf63a](https://gitee.com/dotnetchina/Furion/commit/93cf63a023f3372b80edb5debc46271d2281318a)
- [修复] `AppDbContext` 默认租户属性受工作单元影响问题 [e51557f](https://gitee.com/dotnetchina/Furion/commit/e51557fdf37ae5646b2ea37c227c970eccdbed38)
- [修复] `Scoped.Create` 在 `EFCore` 进行 `Add-Migration` 时候报空异常问题,原因是在 `PM` 环境中不存在根服务[0853e74](https://gitee.com/dotnetchina/Furion/commit/0853e74de90718fce9c0892e2ee4da597f62a918)
- [修复] 定时任务执行异常后异常一直驻留内存问题,修正为执行成功自动清空过去异常 [197a62b](https://gitee.com/dotnetchina/Furion/commit/197a62bb4a7df34eb2c0dbda65121e9cf00d905c)
- [修复] `Jwt` 拓展包不正确的代码导致 IOptions 失效[#I46LUP](https://gitee.com/dotnetchina/Furion/issues/I46LUP)
- [修复] `Swagger` 枚举 `Schema` 过滤器不输出值问题 [#I46LON](https://gitee.com/dotnetchina/Furion/issues/I46LON) [!404](https://gitee.com/dotnetchina/Furion/pulls/404)
- [修复] `Swagger` 处理非 `int` 类型枚举转换 bug [#I46QJ9](https://gitee.com/dotnetchina/Furion/issues/I46QJ9)
- **文档**
- [新增] 包管理工具文档
- [更新] 模板引擎、`Sql` 操作,`数据库上下文` 等等文档
---
## v2.17(已发布)
- **新特性**
- [新增] `IPC(Inter-Process Communication,进程间通信)` 模块功能,目前提供进程内通信和共享内存进程外通讯 [ProcessChannel](https://gitee.com/dotnetchina/Furion/tree/master/framework/Furion/ProcessChannel)
- [新增] 远程请求 `application/xml` 和 `text/xml` 默认支持 [4753a1a](https://gitee.com/dotnetchina/Furion/commit/4753a1aed527a6282fe6c05036de9d50bd3b3dd8)
- [新增] 控制台全局异常拦截 [4a4fe1f](https://gitee.com/dotnetchina/Furion/commit/4a4fe1f40e1856ea36a0c0d19ca625d3f7bf95b7)
- [新增] 支持自定义 `.json` 配置文件扫描目录 [3e2910a](https://gitee.com/dotnetchina/Furion/commit/3e2910a8b775fb6323e293b020bbe7cdfb4c6436)
- [新增] 支持数据库实体接口显式实现接口配置 [9610a0a](https://gitee.com/dotnetchina/Furion/commit/9610a0a481f4f78770bc2fc3ed4cabbef2a8f937)
- [新增] 控制台应用程序全局拦截 `[IfException]` 支持 [4a4fe1f](https://gitee.com/dotnetchina/Furion/commit/4a4fe1f40e1856ea36a0c0d19ca625d3f7bf95b7)
- [新增] 依赖注入模块接口可以限制实现类生存周期,实现类也支持复写生存周期 [d2ce089](https://gitee.com/dotnetchina/Furion/commit/d2ce089130300cdd8b1bc6792f325c5d38ee9404)
- **突破性变化**
- [抽离] `Oops.Retry()` 重试策略功能至新类:`Retry.Invoke()` [6a7bbd0](https://gitee.com/dotnetchina/Furion/commit/6a7bbd0b30a653b9a42d340a63520485aa6bbfa4)
- [移除] `IHttpContextAccessor.SigninToSwagger()` 拓展,请使用 `IHttpContextAccessor.HttpContext.SigninToSwagger()`,退出也一样
- [移除] 全局处理 `Request Body` 重复读处理 `Request.EnableBuffering()` [d92c24b](https://gitee.com/dotnetchina/Furion/commit/d92c24bdb43bfb01643007ebb6a4ee42a5c738e9)
- **问题修复**
- [修复] 规范化状态码过滤逻辑错误问题 [#I44JYS](https://gitee.com/dotnetchina/Furion/issues/I44JYS)
- [修复] 非关系型数据库(内存数据库)注册及操作异常 [e167651](https://gitee.com/dotnetchina/Furion/commit/e1676512a54374427bedbde17cd8cb59d7852557)
- [修复] 远程请求默认序列化问题 [a55603b](https://gitee.com/dotnetchina/Furion/commit/a55603bf7ed109296375dbeffc31591a6f8f8e49)
- [修复] 定时任务零点/整点提前一秒触发问题 [#I4321L](https://gitee.com/dotnetchina/Furion/issues/I4321L)
- [修复] 友好异常在子类重写抽象类方法内部抛异常无法获取的问题 [4a4fe1f](https://gitee.com/dotnetchina/Furion/commit/4a4fe1f40e1856ea36a0c0d19ca625d3f7bf95b7)
- [修复] 修复非 Web 项目抛异常问题 [4a4fe1f](https://gitee.com/dotnetchina/Furion/commit/4a4fe1f40e1856ea36a0c0d19ca625d3f7bf95b7)
- [修复] 数据库实体模型贴 `[NotMapper]` 特性无效 [#I44MNO](https://gitee.com/dotnetchina/Furion/issues/I44MNO)
- **其他更改**
- [调整] Swagger 生成泛型 SchemaIds 默认连接符,由 `Of` 改为 `_` [81946b6](https://gitee.com/dotnetchina/Furion/commit/81946b64e81d9e290f80cd5bcebdb69c99001153)
---
## v2.16(已发布)
- **新特性**
- [新增] **`MVC` 控制器支持规范化处理 [#I427Z2](https://gitee.com/dotnetchina/Furion/issues/I427Z2)**
- [新增] `throw Oops.Bah()` 抛出业务异常(状态码 `400`)
- [新增] `UnifyResultSettings` 规范化 `json` 配置选项 [#I42NY7](https://gitee.com/dotnetchina/Furion/issues/I42NY7)
- [新增] 多语言自定义配置资源文件名及自定义程序集 [#I434YJ](https://gitee.com/dotnetchina/Furion/issues/I434YJ)
- **突破性变化**
- [调整] 规范化结果 `IUnifyResultProvider` 参数 **(破坏性更改)** [#I427Z2](https://gitee.com/dotnetchina/Furion/issues/I427Z2)
- [调整] `IJsonSerializerProvider` 接口参数,去掉 `inherit` 参数 [a55603b](https://gitee.com/dotnetchina/Furion/commit/a55603bf7ed109296375dbeffc31591a6f8f8e49)
```cs
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](https://gitee.com/dotnetchina/Furion/issues/I4354S)
- **其他更改**
- [优化] 多语言底层设计,取消需要创建 `Lang.cs` 空类的要求 [#I434YJ](https://gitee.com/dotnetchina/Furion/issues/I434YJ)
- [优化] `MiniProfiler` 性能,减少不必要的监听
---
## v2.15(已发布)
- **新特性**
- [新增] `Db.GetDbRepository<定位器>()` 静态方法 [#I41MZP](https://gitee.com/dotnetchina/Furion/issues/I41MZP)
- [新增] 远程请求缺省序列化配置选项 [#I41PBW](https://gitee.com/dotnetchina/Furion/issues/I41PBW)
- **问题修复**
- [修复] 自动扫描接口进行依赖注入获取首个接口错误 bug [#I41D1M](https://gitee.com/dotnetchina/Furion/issues/I41D1M)
- [修复] `IRepository<TEntity>` 没有实现 `IRepository<TEntity, TDbContextLocator>` 问题 [#I41MZP](https://gitee.com/dotnetchina/Furion/issues/I41MZP)
- [修复] 远程请求缺省序列化 bug [#I41PBW](https://gitee.com/dotnetchina/Furion/issues/I41PBW)
- [修复] 修复 `AppDbContext.Tenant` 多租户空异常问题 [#I421DA](https://gitee.com/dotnetchina/Furion/issues/I421DA)
- [修复] `Worker Service` 多个 `Worker` 定时任务阻塞问题 [82a79cc](https://gitee.com/dotnetchina/Furion/commit/82a79cce0a3d9b09f4090b7363c3b78327c76846)
- [修复] `Jwt` 自动刷新机制时区处理问题,主要针对国外用户 [#I41UB1](https://gitee.com/dotnetchina/Furion/issues/I41UB1) [82a79cc](https://gitee.com/dotnetchina/Furion/commit/82a79cce0a3d9b09f4090b7363c3b78327c76846)
- **其他更改**
- [优化] **系统启动性能,从 106M 减少到 84M**
- [优化] **大量底层代码,包大小从 391Kb 减少到 350Kb(不带注释版本仅 64Kb)**
---
## v2.13/v2.14(已发布)
- **新特性**
- [新增] 简易字符串模板功能,支持远程请求、数据库模块、日志模块、事件总线模块、定时任务模块、异常模块、数据校验模块 [#I402BL](https://gitee.com/dotnetchina/Furion/issues/I402BL)
- [新增] `404` 状态码规范化默认处理 [#I408F5](https://gitee.com/dotnetchina/Furion/issues/I408F5)
- [新增] 定时任务 `ISpareTimeWorker` 声明方式支持异步方法 [#I40KWR](https://gitee.com/dotnetchina/Furion/issues/I40KWR)
- [新增] 自动配置二级虚拟目录 [!354](https://gitee.com/dotnetchina/Furion/pulls/354)
- **突破性变化**
- [升级] **框架依赖 `SDK` 为 `.NET 5.0.8` 版本**
- [移除] `Db.GetNewDbContext()` 静态方法 [#I400BK](https://gitee.com/dotnetchina/Furion/issues/I400BK)
- [移除] 数据库模块时态表拓展支持 [#I405HI](https://gitee.com/dotnetchina/Furion/issues/I405HI)
- [调整] `IJsonSerializerProvider` 接口参数,新增 `inherit` 参数 [#I3ZQU5](https://gitee.com/dotnetchina/Furion/issues/I3ZQU5)
- [调整] `AppSettings` 配置的 `LogEntityFrameworkCoreSqlExecuteCommand` 名称为 `OutputOriginalSqlExecuteLog` [#I40VVE](https://gitee.com/dotnetchina/Furion/issues/I40VVE)
- **问题修复**
- [修复] `Worker Services` 定时任务边界值问题导致跳过单次任务 [#I405NI](https://gitee.com/dotnetchina/Furion/issues/I405NI)
- [修复] `Worker Services` 独立发布后程序集扫描失效 bug [#I3ZH3X](https://gitee.com/dotnetchina/Furion/issues/I3ZH3X)
- [修复] 远程请求如果配置了 `Client` 客户端但传入了空 `RequestUrl` 地址导致异常问题 [#I40BC6](https://gitee.com/dotnetchina/Furion/issues/I40BC6)
- [修复] 规范化结果篡改非短路端状态码出现异常 bug [#I408F5](https://gitee.com/dotnetchina/Furion/issues/I408F5)
- **其他更改**
- [优化] `App.GetServiceProvider(type)` 解析服务性能 [#I40KXN](https://gitee.com/dotnetchina/Furion/issues/I40KXN)
- [调整] 视图引擎保存成文件流默认缓存区大小,从 `4096` 提升至 `8192` [#I40KH5](https://gitee.com/dotnetchina/Furion/issues/I40KH5)
---
## v2.10/2.11/2.12 (已发布)
> 该版本有多个破坏性更改,更新时请认真查看。
- **新特性**
- [新增] `App.Configuration.Reload()` 拓展 [#I3XYI8](https://gitee.com/dotnetchina/Furion/issues/I3XYI8)
- [新增] `ISubscribeHandler` 支持异步方法定义 [#I3XYHJ](https://gitee.com/dotnetchina/Furion/issues/I3XYHJ)
- [新增] `app.UseUnifyResultStatusCodes()` 可配置修改返回状态码 [#I3VZQH](https://gitee.com/dotnetchina/Furion/issues/I3VZQH)
- [新增] 远程请求添加默认 `User-Agent` 头 [#I3W17C](https://gitee.com/dotnetchina/Furion/issues/I3W17C)
- [新增] 支持 `Sql` 高级代理切换数据库上下文定位器 [#I3XFP6](https://gitee.com/dotnetchina/Furion/issues/I3XFP6) [#I3XDCR](https://gitee.com/dotnetchina/Furion/issues/I3XDCR)
- [新增] 定时任务 `CronFormat` 自动识别 [#I3Y7GT](https://gitee.com/dotnetchina/Furion/issues/I3Y7GT)
- [新增] `Sql 高级代理` 拦截功能 [#I3YHG4](https://gitee.com/dotnetchina/Furion/issues/I3YHG4)
- [新增] 拦截远程请求所有异常处理 [#I3YPDE](https://gitee.com/dotnetchina/Furion/issues/I3YPDE)
- [新增] 远程请求配置 `Timeout` 超时时间 [#I3YPPK](https://gitee.com/dotnetchina/Furion/issues/I3YPPK)
- [新增] 新增 `RSA` 加密算法 [#I3YZNU](https://gitee.com/dotnetchina/Furion/issues/I3YZNU) [!345](https://gitee.com/dotnetchina/Furion/pulls/345)
- [新增] `DataTable` 和 `DataSet` 支持不指定强类型返回 [#I3Z6RI](https://gitee.com/dotnetchina/Furion/issues/I3Z6RI)
- [新增] `Sql` 字符串拓展方法设置 `Timeout` 超时时间 [#I3ZKWF](https://gitee.com/dotnetchina/Furion/issues/I3ZKWF)
- [新增] `Sql` 高级代理 `[Timeout]` 特性,设置超时时间 [#I3ZKWF](https://gitee.com/dotnetchina/Furion/issues/I3ZKWF)
- **突破性变化**
- [移除] **`FakeDelete` 假删除/软删除所有功能 [#I3XKII](https://gitee.com/dotnetchina/Furion/issues/I3XKII)**
- [移除] **移除 `PBKDF2` 加密算法 [#I3Z0IO](https://gitee.com/dotnetchina/Furion/issues/I3Z0IO)**
- [调整] **远程请求设置超时时间单位由 `分钟` 改为 `秒` [#I3YPPK](https://gitee.com/dotnetchina/Furion/issues/I3YPPK)**
- [调整] **`IJsonSerializerProvider` 接口参数,新增 `inherit` 参数 [#I3ZQU5](https://gitee.com/dotnetchina/Furion/issues/I3ZQU5)**
- [调整] `[NonAutomatic]` 特性名称为 `[Manual]` [#I3XKKX](https://gitee.com/dotnetchina/Furion/issues/I3XKKX)
- [调整] `[NotChangedListener]` 特性名称为 `[SuppressChangedListener]` [#I3XKLZ](https://gitee.com/dotnetchina/Furion/issues/I3XKLZ)
- [调整] `[ManualSaveChanges]` 名称为 `[ManualCommit]` [#I3XKNP](https://gitee.com/dotnetchina/Furion/issues/I3XKNP)
- [调整] **`DbContext.TenantIdQueryFilterExpression` 名称为 `DbContext.BuildTenantQueryFilter` [#I3XKTB](https://gitee.com/dotnetchina/Furion/issues/I3XKTB)**
- [调整] `[SkipScan]` 名称为 `[SuppressSniffer]` [#I3XN5N](https://gitee.com/dotnetchina/Furion/issues/I3XN5N)
- [调整] `[SkipProxy]` 名称为 `[SuppressProxy]` [#I3XN7O](https://gitee.com/dotnetchina/Furion/issues/I3XN7O)
- [重构] `Sql` 执行,性能提升 20% [#I3W33U](https://gitee.com/dotnetchina/Furion/issues/I3W33U)
- **问题修复**
- [修复] 动态 WebAPI 扫描控制器没有屏蔽没有注册的第三方控制器 [#I3Y7TJ](https://gitee.com/dotnetchina/Furion/issues/I3Y7TJ)
- [修复] `AppDbContext` 设置 `TablePrefix` 无效: [#I3Y57Q](https://gitee.com/dotnetchina/Furion/issues/I3Y57Q)
- [修复] 修复定时任务使用异步委托导致程序终止 bug [#I3XVZ0](https://gitee.com/dotnetchina/Furion/issues/I3XVZ0)
- [修复] 事件总线一个 `消息id` 对应多个 `Handler` 只触发第一个[#I3XYP0](https://gitee.com/dotnetchina/Furion/issues/I3XYP0)
- [修复] `.ToPagedList()` 分页方法传入小于或等于 0 的页码 [#I3XNAN](https://gitee.com/dotnetchina/Furion/issues/I3XNAN)
- [修复] `JSON` 序列化默认 `DateTimeOffset` 异常 [#I3XMOL](https://gitee.com/dotnetchina/Furion/issues/I3XMOL)
- [修复] 继承 `Serilog` 日志在 `Worker Service` 生成重复日志 bug [#I3WA0L](https://gitee.com/dotnetchina/Furion/issues/I3WA0L) [!331](https://gitee.com/dotnetchina/Furion/pulls/331)
- [修复] `粘土对象` 动态添加 `Clay` 类型 bug [#I3W9LW](https://gitee.com/dotnetchina/Furion/issues/I3W9LW)
- [修复] `ValidationTypes.Numeric` 校验数值类型正则表达式错误 [#I3WADS](https://gitee.com/dotnetchina/Furion/issues/I3WADS)
- [修复] 数据库命令参数 `DbParameter` 的 `Value` 是 `object` 类型的时候且不指定 [#I3YKM6](https://gitee.com/dotnetchina/Furion/issues/I3YKM6)
- [修复] `Oracle` 数据库存储过程 `游标参数` 报错问题 [#I3ZBYE](https://gitee.com/dotnetchina/Furion/issues/I3ZBYE)
- [修复] `Worker Services` 采用独立发布后无法执行问题 [#I3ZH3X](https://gitee.com/dotnetchina/Furion/issues/I3ZH3X)
- [修复] 修复远程请求如果无返回值序列化异常问题 [!348](https://gitee.com/dotnetchina/Furion/pulls/348)
- **其他更改**
- [增强] 支持 `appsettings.json` 等自定义配置文件中文命名 [#I3YBFD](https://gitee.com/dotnetchina/Furion/issues/I3YBFD)
- [改进] 远程请求配置命名客户端 `BaseAddress` 地址兼容处理 [#I3YCRH](https://gitee.com/dotnetchina/Furion/issues/I3YCRH)
- [移除] 框架无用代码、优化代码
- [优化] `Furion` 在 `非 Web` 环境下性能
- **文档变化**
- [新增] 会话和状态管理 文档 [#I3YI3G](https://gitee.com/dotnetchina/Furion/issues/I3YI3G)
- [更新] 远程请求、日志、数据库上下文、远程请求、`Sql` 高级代理文档
- [更新] 配置文件 [#I3Y2EV](https://gitee.com/dotnetchina/Furion/issues/I3Y2EV)
- **问答答疑**
- [答疑] `dapper` 多个数据源如何继承 [#I3WUOI](https://gitee.com/dotnetchina/Furion/issues/I3WUOI)
- [答疑] 关于 `SpareTime` 多次执行问题[#I3XEQU](https://gitee.com/dotnetchina/Furion/issues/I3XEQU)
- [答疑] 选项更改通知(热更新):数据库里的数据更改了如何通知选项进行改变? [#I3XYI8](https://gitee.com/dotnetchina/Furion/issues/I3XYI8)
- [答疑] `SaaS` 多租户添加时无法获取租户`Id` [#I3Y5CF](https://gitee.com/dotnetchina/Furion/issues/I3Y5CF)
- [答疑] 获取 `_httpContextAccessor.HttpContext` 为空[#I3Y6BI](https://gitee.com/dotnetchina/Furion/issues/I3Y6BI)
- [答疑] `Ubuntu` 中使用 `App.Configuration` 方法读取不到值 [#I3Y74H](https://gitee.com/dotnetchina/Furion/issues/I3Y74H)
- [答疑] 数据库上下文作用域问题 [#I3YHXP](https://gitee.com/dotnetchina/Furion/issues/I3YHXP)
- [答疑] 使用 `UnitofWork` 提交事务,可以提交成功,但是系统会有错误 [#I3YIWU](https://gitee.com/dotnetchina/Furion/issues/I3YIWU)
- [答疑] 数据库读写分离--非默认主库的从库随机该如何配置? [#I3YVR7](https://gitee.com/dotnetchina/Furion/issues/I3YVR7)
- **不做实现**
- [废弃] `SpareTIme` 新增 `Dashboard` 控制台看板,同时可以对任务进行暂停、删除、查看[#I3XELY](https://gitee.com/dotnetchina/Furion/issues/I3XELY)
---
## v2.9.0 (当前版本)
- **新特性**
- [新增] **应用全局未托管资源监听,并实现特定时机释放非托管资源** [#I3VXAU](https://gitee.com/dotnetchina/Furion/issues/I3VXAU)
- [新增] 不包含 `EntityFramework.Core` 版本的 `Furion.Pure` 包[#I3VGW8](https://gitee.com/dotnetchina/Furion/issues/I3VGW8)
- [新增] swagger 支持设置多语言方式,设置的语言自动添加到 api 地址后面 [#I3VDTD](https://gitee.com/dotnetchina/Furion/issues/I3VDTD)
- [新增] 动态 WebAPI 支持 `[FromRoute]` 非必填(选填)参数设置 [#I3VFIM](https://gitee.com/dotnetchina/Furion/issues/I3VFIM)
- [新增] 动态 WebAPI 参数支持配置路由约束 [#I3VFIR](https://gitee.com/dotnetchina/Furion/issues/I3VFIR)
- [新增] `MD5` 和 `DESC` 加密支持 `大写` 输出 [#326](https://gitee.com/dotnetchina/Furion/pulls/326)
- **突破性变化**
- [新增] `Furion` 所有包生成 `.snupkg` 包,支持开发阶段直接调试 `Furion` 所有包源码 [#I3VFIX](https://gitee.com/dotnetchina/Furion/issues/I3VFIX)
- [调整] `repository.BuildChange()` 方法的返回值,多返回一个 `IServiceScope` 对象 [#I3VX3D](https://gitee.com/dotnetchina/Furion/issues/I3VX3D)
- [调整] `JWT` 刷新 `Token` 方法 `AutoRefreshToken` 参数 `days` 改为 `minutes` [#I3VXNB](https://gitee.com/dotnetchina/Furion/issues/I3VXNB)
- **问题修复**
- [修复] `App.GetOptionsSnapshot<>` 从根服务解析异常 bug [#I3VS2X](https://gitee.com/dotnetchina/Furion/issues/I3VS2X)
- [修复] 修复远程请求如果出现异常,返回 `Stream` 为 null 导致异常的问题 [#I3VSTU](https://gitee.com/dotnetchina/Furion/issues/I3VSTU)
- [修复] 如果实体被跟踪后,无法执行删除操作 [#I3W08P](https://gitee.com/dotnetchina/Furion/issues/I3W08P)
- **其他更改**
- [优化] 运行时内存,实现请求结束自动释放未托管资源 [#I3VXAU](https://gitee.com/dotnetchina/Furion/issues/I3VXAU)
- **文档变化**
- [更新] `App` 静态类文档、远程请求文档、分表分库文档
- **问答答疑**
- [答疑] 动态 WebAPI,自定义根据方法名生成 [HttpMethod] 规则报错 [#I3VKQG](https://gitee.com/dotnetchina/Furion/issues/I3VKQG)
- [答疑] `InsertAsync` 的时候提示 `ID` 为空 [#I3VS7E](https://gitee.com/dotnetchina/Furion/issues/I3VS7E)
- [答疑] `FirstOrDefault` 自动过滤了 `TanantId` 字段 [#I3W0VH](https://gitee.com/dotnetchina/Furion/issues/I3W0VH)
- [答疑] 对方接口返回 `HttpConnectionResponseContent` 远程请求拿不到返回值 [#I3W17C](https://gitee.com/dotnetchina/Furion/issues/I3W17C)
- [答疑] 查询方法 `FindOrDefault` 报错 [#I3W830](https://gitee.com/dotnetchina/Furion/issues/I3W830)
- [答疑] `SqlNonQuery` 在 `UnitOfWork` 循环执行[#I3W8WW](https://gitee.com/dotnetchina/Furion/issues/I3W8WW)
- [答疑] 因 `Swagger` 配置问题,导致 `Swagger` 中不能自动携带 token 授权的问题 [#I3W934](https://gitee.com/dotnetchina/Furion/issues/I3W934)
- [答疑] 远程请求 `SetBody` 参数识别不了[#I3WBM1](https://gitee.com/dotnetchina/Furion/issues/I3WBM1)
- [答疑] `Scoped.Create` 里执行 `sql.SqlNonQuery()` 或者 `obj.insert()` 问题[#I3WB5O](https://gitee.com/dotnetchina/Furion/issues/I3WB5O)
- [答疑] 调用函数或存储过程,怎么出参数据自定义对象?如 `Oracle`数据库的数组或记录 [#I3W71W](https://gitee.com/dotnetchina/Furion/issues/I3W71W)
- **不做实现**
- [无效] 数据库小写下划线字段,无法自动映射成小驼峰 [#I3W021](https://gitee.com/dotnetchina/Furion/issues/I3W021)
- [废弃] `EfCore 5` 直接多对多时进行 `SeedData` [#I3WDRJ](https://gitee.com/dotnetchina/Furion/issues/I3WDRJ)
---
## v2.7.0/2.8.0 (已发布)
- **新特性**
- [新增] `throw Oops.On("异常消息")` 应用多语言支持 [#I3UYC2](https://gitee.com/dotnetchina/Furion/issues/I3UYC2)
- [新增] `Db.GetMSRepository()` 获取主从库仓储静态方法 [#I3UBSJ](https://gitee.com/dotnetchina/Furion/issues/I3UBSJ)
- [新增] 工作单元特性,支持静态类强制性开启共享事务 [#I3S9N8](https://gitee.com/dotnetchina/Furion/issues/I3S9N8)
- [新增] `EFCore` 执行 `sql` 模式打印日志 [#I3SE8X](https://gitee.com/dotnetchina/Furion/issues/I3SE8X)
- [新增] 远程请求支持默认 `HttpClient` 配置 [#I3SI17](https://gitee.com/dotnetchina/Furion/issues/I3SI17)
- [新增] 新增 `短 ID` 生成功能 [#I3T7JP](https://gitee.com/dotnetchina/Furion/issues/I3T7JP)
- [新增] `[SensitiveDetection]` 支持配置替换敏感词汇 [#I3THIA](https://gitee.com/dotnetchina/Furion/issues/I3THIA)
- [新增] `SpecificationDocumentBuilder.DocumentGroups` 和 `SpecificationDocumentBuilder.CheckApiDescriptionInCurrentGroup(currentGroup, apiDescription)` 公开方法[#I3UDSY](https://gitee.com/dotnetchina/Furion/issues/I3UDSY)
- **突破性变化**
- [重构] 自动扫描 `.json` 和 `.xml` 文件并加载到配置中的代码和规则,同时移除默认 `.xml` 文件加载,只保留 `.json` 文件 [#I3UJ3L](https://gitee.com/dotnetchina/Furion/issues/I3UJ3L)
- [重构] 分布式连续 `GUID` 代码 [#I3UBK0](https://gitee.com/dotnetchina/Furion/issues/I3UBK0)
- [调整] **`Scoped.CreateUnitOfWork` 名称为 `Scoped.CreateUow` [#I3SJPU](https://gitee.com/dotnetchina/Furion/issues/I3SJPU)**
- [调整] `JWTEncryption.Validate` 返回值,支持返回 `TokenValidationResult` [#I3S2ND](https://gitee.com/dotnetchina/Furion/issues/I3S2ND)
- **问题修复**
- [修复] `[DataValidation]` 和 `[SensitiveDetection]` 多语言应用失效 [#I3UH6U](https://gitee.com/dotnetchina/Furion/issues/I3UH6U)
- [修复] `Scoped` 系列方法异步出现 `Task is cancel` 情况 [#I3SJF6](https://gitee.com/dotnetchina/Furion/issues/I3SJF6)
- [修复] `Mysql` 数据库的 `ToPagedList` 方法返回的结果进行遍历出现 `MySqlConnection is aleady use` 问题 [#I3SJQ3](https://gitee.com/dotnetchina/Furion/issues/I3SJQ3)
- [修复] `tool/cli.psl` 没有包含项目名称 [#I3S1T6](https://gitee.com/dotnetchina/Furion/issues/I3S1T6)
- [修复] 远程请求做上传文件时,没有传入 `Body`,程序直接跳过 [#I3TKFH](https://gitee.com/dotnetchina/Furion/issues/I3TKFH)
- [修复] 远程请求 `multipart/form-data` 内容分割符缺失 [#I3TNO9](https://gitee.com/dotnetchina/Furion/issues/I3TNO9)
- [修复] 远程请求代理拦截方式返回 `HttpResponseMessage` 问题 [#I3V161](https://gitee.com/dotnetchina/Furion/issues/I3V161)
- [修复] `repository.Database.SetCommandTimeout(600)` 无法生效[#I3VAQS](https://gitee.com/dotnetchina/Furion/issues/I3VAQS)
- **其他更改**
- [改进] 支持规范化结果中间件判断是否跳过规范化结果 [#I3T2AA](https://gitee.com/dotnetchina/Furion/issues/I3T2AA)
- [调整] 更新部分列 `UpdateIncludeNowAsync` 具有二义性 [#I3RW9Q](https://gitee.com/dotnetchina/Furion/issues/I3RW9Q)
- [优化] **框架底层性能,大大减少内存占用和溢出情况,启动内存从之前 `136M` 下将到 `86M`**
- [其他] 删除无用代码,优化不规范命名等
- **文档变化**
- [新增] `Inject` 说明文档 [#I3TITA](https://gitee.com/dotnetchina/Furion/issues/I3TITA)
- [更新] 4.2.9 的示例代码文档,方法没有放在 class 中 [#I3S9T5](https://gitee.com/dotnetchina/Furion/issues/I3S9T5)
- [修正] 规范化结果 6.5.6 多分组排序图片引用错误 [#I3UBOQ](https://gitee.com/dotnetchina/Furion/issues/I3UBOQ)
- [更新] 静态类 `Scoped` 文档
- **问答答疑**
- [答疑] 默认 `MasterDbContextLocator` 不随自定义的参数生成 [#I3SDBB](https://gitee.com/dotnetchina/Furion/issues/I3SDBB)
- [答疑] 事件总线中订阅处理程序类获取不到用户信息,这个正常吗 [#I3SS0U](https://gitee.com/dotnetchina/Furion/issues/I3SS0U)
- [答疑] 在有多租户过滤器的情况下,是否有一种方式查询全量的数据 [#I3T0VI](https://gitee.com/dotnetchina/Furion/issues/I3T0VI)
- [答疑] mysql 使用 `&"tools/cli.ps1"` 页面化加载表结构失败 [#I3T4F8](https://gitee.com/dotnetchina/Furion/issues/I3T4F8)
- [答疑] 其他 Web 层的 Startup 优先执行 [#I3T8IP](https://gitee.com/dotnetchina/Furion/issues/I3T8IP)
- [答疑] 辅助角色服务实现建议 [#I3T906](https://gitee.com/dotnetchina/Furion/issues/I3T906)
- [答疑] 开启 `easy connection` 后同一内网地址浏览器可以正常访问,远程请求则无法访问[#I3TA2U](https://gitee.com/dotnetchina/Furion/issues/I3TA2U)
- [答疑] `scope.ServiceProvider.GetService<IOtherService>`不存在 [#I3TQMV](https://gitee.com/dotnetchina/Furion/issues/I3TQMV)
- [答疑] 能否在 WPF 项目中使用呢? [#I3TMCC](https://gitee.com/dotnetchina/Furion/issues/I3TMCC)
- [答疑] `Dapper` 多个数据源 [#I3TM9B](https://gitee.com/dotnetchina/Furion/issues/I3TM9B)
- [答疑] `L.GetSelectCulture()` 方法异常 [#I3TQS4](https://gitee.com/dotnetchina/Furion/issues/I3TQS4)
- [答疑] 循环中使用 `IDGen.NextID()` 得到的结果并不是连续的 [#I3UAF6](https://gitee.com/dotnetchina/Furion/issues/I3UAF6)
- [答疑] 模块化动态加载插件支持通配符匹配.dll [#I3UDT8](https://gitee.com/dotnetchina/Furion/issues/I3UDT8)
- [答疑] `MVC` 模式,在 `Controller` 里快捷方式创建 `View` 页面出错 [#I3UFGB](https://gitee.com/dotnetchina/Furion/issues/I3UFGB)
- [答疑] 数据库迁移没有种子数据 [#I3UI7G](https://gitee.com/dotnetchina/Furion/issues/I3UI7G)
- [答疑] `SpareTimeAttribute` 中 根据 Cron 表达式 自动匹配 Cron 表达式格式化方式 [#I3UTKQ](https://gitee.com/dotnetchina/Furion/issues/I3UTKQ)
- [答疑] 使用 `workService` 集成 `SqlSugar` 报错 [#I3V8HJ](https://gitee.com/dotnetchina/Furion/issues/I3V8HJ)
- [答疑] `sqlserver 2008` 分页报错如何解决呢 [#I3VF96](https://gitee.com/dotnetchina/Furion/issues/I3VF96)
- **不做实现**
- [废弃] 添加令牌桶限流算法 [#I3SCDV](https://gitee.com/dotnetchina/Furion/issues/I3SCDV)
- [废弃] 定时任务立即执行需求 [#I3SF4A](https://gitee.com/dotnetchina/Furion/issues/I3SF4A)
- [废弃] 文档建议 关于 reids 和 es 、消息队列的 [#I3T90I](https://gitee.com/dotnetchina/Furion/issues/I3T90I)
- [废弃] IP 高频率请求限制 [#I3UHE1](https://gitee.com/dotnetchina/Furion/issues/I3UHE1)
- [废弃] `Url` 转发大模块 [#I3TZHO](https://gitee.com/dotnetchina/Furion/issues/I3TZHO)
---
## v2.5.0/2.6.0 (已发布)
- **新特性**
- [新增] 虚拟文件服务,支持物理文件和嵌入资源文件 [#I3RBR9](https://gitee.com/dotnetchina/Furion/issues/I3RBR9)
- [新增] 读写分离/主从复制仓储 `IMSRepository` 和 `IMSRepository<TMasterDbContextLocator>` 仓储,可进行随机或自定义获取从库
- [新增] 数据脱敏处理 [#I3R5ZF](https://gitee.com/dotnetchina/Furion/issues/I3R5ZF)
- **突破性变化**
- [移除] **`InsertOrUpdate` 一系列数据库操作方法** [#I3RI9L](https://gitee.com/dotnetchina/Furion/issues/I3RI9L)
- [移除] 所有包含 `Exists` 单词的数据库操作方法 [#I3RJ0T](https://gitee.com/dotnetchina/Furion/issues/I3RJ0T)
- [调整] 分布式 GUID `IDGenerater` 静态类名称为 `IDGen` [#I3RGUA](https://gitee.com/dotnetchina/Furion/issues/I3RGUA)
- **问题修复**
- [修复] 远程调用方法错误,请求报文头 `Headers` 不能添加到 `IHttpDispatchProxy` 的子接口上 [#I3RAF7](https://gitee.com/dotnetchina/Furion/issues/I3RAF7)
- **其他更改**
- [优化] 应用启动性能,减少内存分配
- **文档变化**
- [新增] 脱敏处理文档 [#I3R6WZ](https://gitee.com/dotnetchina/Furion/issues/I3R6WZ)
- [新增] 文件系统文档、`FS` 静态类文档 [#I3RCC4](https://gitee.com/dotnetchina/Furion/issues/I3RCC4)
- [更新] 读写分离/主从复制、数据库仓储文档、`Db` 静态类 [#I3R3B6](https://gitee.com/dotnetchina/Furion/issues/I3R3B6)
- **问答答疑**
- [答疑] 关于 `Furion` 集群部署 [#I3R3J4](https://gitee.com/dotnetchina/Furion/issues/I3R3J4)
- [答疑] 升级最新框架以后, 数据库生成模型报错 [#I3R7TP](https://gitee.com/dotnetchina/Furion/issues/I3R7TP)
- [答疑] 数据库上下文事务执行中,`SaveNow` 执行后有警告 [#I3RAJI](https://gitee.com/dotnetchina/Furion/issues/I3RAJI)
- [答疑] `Hangfire` 使用事务出现错误 [#I3ROQ5](https://gitee.com/dotnetchina/Furion/issues/I3ROQ5)
- [答疑] 如何实现 cli 不执行某些表的迁移,web 请求可以正常操作呢? [#I3ROU5](https://gitee.com/dotnetchina/Furion/issues/I3ROU5)
- [答疑] 在使用定时任务时候出现的问题:继承 `ISpareTimeWorker` [#I3RRZS](https://gitee.com/dotnetchina/Furion/issues/I3RRZS)
- [答疑] `MySql` 时间差 8 小时处理 [#I3RSCO](https://gitee.com/dotnetchina/Furion/issues/I3RSCO)
- [答疑] `Db.GetRepository<>` 方法结合 `[UnitOfWork]` 后不可用 [#I3RUK5](https://gitee.com/dotnetchina/Furion/issues/I3RUK5)
- [答疑] 事务开启失败问题 [#I3RYJY](https://gitee.com/dotnetchina/Furion/issues/I3RYJY)
- [答疑] 支持 `DbProvider` 可动态配置 [#I3RYPE](https://gitee.com/dotnetchina/Furion/issues/I3RYPE)
- [答疑] `WorkService` 依赖注入 `ISingleton` 问题 [#I3RZ1L](https://gitee.com/dotnetchina/Furion/issues/I3RZ1L)
- [答疑] `ISpareTimeWorker` 运行期动态修改 [#I3S33Q](https://gitee.com/dotnetchina/Furion/issues/I3S33Q)
- **不做实现**
- [拒绝] 有序 `Guid` 精度是固定的毫秒级:1 毫秒内生成的多个 `Guid` 是无序的 [#I3R59J](https://gitee.com/dotnetchina/Furion/issues/I3R59J)
- [拒绝] 建议:JWTEncryption.Validate 方法返回 JWT 的检查失败时的原因 [#I3S1F2](https://gitee.com/dotnetchina/Furion/issues/I3S1F2)
---
## v2.4.0 (已发布)
- **新特性**
- [新增] 支持自动加载模块化/插件 `.xml` 注释文件 [#I3Q7XY](https://gitee.com/dotnetchina/Furion/issues/I3Q7XY)
- [新增] `AppDbContext.FailedAutoRollback` 属性,可配置事务是否自动回滚 [#I3QOUS](https://gitee.com/dotnetchina/Furion/issues/I3QOUS)
- **突破性变化**
- [升级] **.NET 5 SDK 为 5.0.6 版本**
- [新增] `IJsonSerializerProvider.GetSerializerOptions()` 接口方法 [#I3QIJN](https://gitee.com/dotnetchina/Furion/issues/I3QIJN)
- **问题修复**
- [修复] 通过 `services.AddInject()` 方式注册,模块化/插件不加载 [#I3Q7XH](https://gitee.com/dotnetchina/Furion/issues/I3Q7XH)
- [修复] 种子数据返回 `null` 报空异常 [#I3QCM5](https://gitee.com/dotnetchina/Furion/issues/I3QCM5)
- [修复] 通过 `Clay.Object` 创建粘土对象后属性变小写问题 [#I3QRV3](https://gitee.com/dotnetchina/Furion/issues/I3QRV3)
- **其他更改**
- [优化] `Furion` 框架底层性能,减少内存占用,提高应用初始化速度 [92f8cc1](https://gitee.com/dotnetchina/Furion/commit/92f8cc1)
- **文档变化**
- [更新] JSON 序列化文档、规范化结果文档、数据库上下文文档
- **问答答疑**
- [答疑] `InsertOrUpdateNowAsync` 报错 [#I3QKO5](https://gitee.com/dotnetchina/Furion/issues/I3QKO5)
- **不做实现**
- [废弃] 定时任务自定义 `Failed` 事件 [#I3QCM2](https://gitee.com/dotnetchina/Furion/issues/I3QCM2)
- [废弃] 模块化动态生成数据库表 [#I3QH3G](https://gitee.com/dotnetchina/Furion/issues/I3QH3G)
- [废弃] 建议事件总线新增 MQ 支持 [#I3QWZ4](https://gitee.com/dotnetchina/Furion/issues/I3QWZ4)
- [废弃] 重构规范化整个模块代码 [#I3NFT7](https://gitee.com/dotnetchina/Furion/issues/I3NFT7)
---
## v2.3.0 (已发布)
- **新特性**
- [新增] `Furion.Extras.DatabaseAccessor.MongoDB` 拓展包支持 [#I3PKST](https://gitee.com/dotnetchina/Furion/issues/I3PKST)
- [新增] 动态粘土类型直接转 `object` 或 `dynamic` 类型 [#I3OY27](https://gitee.com/dotnetchina/Furion/issues/I3OY27)
- [新增] 新增 `Oops.Retry` 方法,支持设置方法调用失败进行重试 [#I3PJKQ](https://gitee.com/dotnetchina/Furion/issues/I3PJKQ)
- [新增] `JWTSettings` 配置节点 `Algorithm`,用于配置加密算法 [#I3PQGV](https://gitee.com/dotnetchina/Furion/issues/I3PQGV)
- [新增] `repository.EnsureTransaction()` 方法确保工作单元事务有效 [#I3PVF1](https://gitee.com/dotnetchina/Furion/issues/I3PVF1)
- **突破性变化**
- [支持] 支持 .NET 6.0.0 Preview 3 版本 [#I3P2C7](https://gitee.com/dotnetchina/Furion/issues/I3P2C7)
- **问题修复**
- [修复] 使用数据库生成模型 `tools/cli.ps1`,从数据库表生成的实体异常 [#I3PL18](https://gitee.com/dotnetchina/Furion/issues/I3PL18)
- [修复] 贴了 `[NonUntify]` 特性后,`Swagger` 的 `Example Value` 没有匹配正确 [#I3PK0L](https://gitee.com/dotnetchina/Furion/issues/I3PK0L)
- [修复] `SpareTimer.Tally` 在 `Cron` 表达式中计数无效 [#I3PWSE](https://gitee.com/dotnetchina/Furion/issues/I3PWSE)
- **其他更改**
- [改进] 框架默认序列化应该从配置中读取,而非手动编写 [#I3P1SJ](https://gitee.com/dotnetchina/Furion/issues/I3P1SJ)
- [改进] `SqlSugar` 拓展库,支持非泛型仓储获取上下文操作对象 [#I3PK2N](https://gitee.com/dotnetchina/Furion/issues/I3PK2N)
- [改进] 支持分布式内存缓存可配置化 [#I3POKD](https://gitee.com/dotnetchina/Furion/issues/I3POKD)
- **文档变化**
- [文档] 添加 `JWTSettings` 配置独立文档 [#I3PQGW](https://gitee.com/dotnetchina/Furion/issues/I3PQGW)
- **问答答疑**
- [答疑] 软删除如果数据不存在,则报错 [#I3PTVB](https://gitee.com/dotnetchina/Furion/issues/I3PTVB)
- [答疑] 多个类集成测试会造成数据库定位器多次注册,无法运行所有测试,只能一个类一个类的运行 [#I3PXGY](https://gitee.com/dotnetchina/Furion/issues/I3PXGY)
- **不做实现**
- [废弃] CAS 支持[#I3PIET](https://gitee.com/dotnetchina/Furion/issues/I3PIET)
---
## v2.2.0 (已发布)
- **新特性**
- [新增] `Clay` 粘土类型,支持让 `C#` 创建一个弱类型对象并操作弱类型 [#I3O2QQ](https://gitee.com/dotnetchina/Furion/issues/I3O2QQ)
- [新增] 新增 `Scoped.Create` 带返回值重载 [#I3O47J](https://gitee.com/dotnetchina/Furion/issues/I3O47J)
- [新增] 支持 `Scoped.Create()` 一系列方法支持传入作用域工厂 [#I3OAP5](https://gitee.com/dotnetchina/Furion/issues/I3OAP5)
- [新增] 支持事件总线同步执行方式 [#I3OAW2](https://gitee.com/dotnetchina/Furion/issues/I3OAW2)
- [新增] `[DataValidation]` 跳过空字符串和空值验证 [#I3OGEN](https://gitee.com/dotnetchina/Furion/issues/I3OGEN)
- [新增] `Worker Service` 可配置是否自动注册 `Worker` [#I3OLW4](https://gitee.com/dotnetchina/Furion/issues/I3OLW4)
- **突破性变化**
- **问题修复**
- [修复] 定时任务设置 `cancelInNoneNextTime: false` 一次也不执行 [#I3O3N0](https://gitee.com/dotnetchina/Furion/issues/I3O3N0)
- [修复] SpareTime 自定义下次执行时间出现空异常 [#I3O46X](https://gitee.com/dotnetchina/Furion/issues/I3O46X)
- [修复] `MiniProfiler` 设置为 `false` 时,数据库上下文提交拦截器未添加 [#I3OAWX](https://gitee.com/dotnetchina/Furion/issues/I3OAWX)
- [修复] `[Consumes("application/x-www-form-urlencoded")]` 和 `ModelQuery` 配置同时配置导致空引用问题 [#I3ODUR](https://gitee.com/dotnetchina/Furion/issues/I3ODUR)
- [修复] 在 Grpc 中使用 jwt 授权出现空异常 [#I3OW3I](https://gitee.com/dotnetchina/Furion/issues/I3OW3I)
- **其他更改**
- [优化] 支持发布后代码精简配置,减少不必要的文件夹输出 [#I3OAPF](https://gitee.com/dotnetchina/Furion/issues/I3OAPF)
- [优化] 自动刷新 Token 机制,新增容错值处理,解决并发 Token 刷新失败问题 [#I3OGYF](https://gitee.com/dotnetchina/Furion/issues/I3OGYF)
- **文档变化**
- [新增] 粘土对象文档 [#I3OG18](https://gitee.com/dotnetchina/Furion/issues/I3OG18)
- **问答答疑**
- [答疑] 动态 WebAPI 如何获取接收文件 [#I3O29B](https://gitee.com/dotnetchina/Furion/issues/I3O29B)
- [答疑] 定时任务使用 `Scope.CreateUnitOfWork` 引发的问题 [#I3O2CD](https://gitee.com/dotnetchina/Furion/issues/I3O2CD)
- [答疑] 单文件发布程序工作不正常 [#I3O4D8](https://gitee.com/dotnetchina/Furion/issues/I3O4D8)
- [答疑] 同时配置租户过滤器和软删除过滤器,最终的 sql 只生成了一种过滤条件 [#I3OB0A](https://gitee.com/dotnetchina/Furion/issues/I3OB0A)
- [答疑] HTTP 重定向 HTTPS 后跨域失效 [#I3OB8R](https://gitee.com/dotnetchina/Furion/issues/I3OB8R)
- [答疑] 在 PostgreSql 数据库使用 `rep.FirstOrDefault(u => u.Id == UserId);` 引起异常 [#I3O5OF](https://gitee.com/dotnetchina/Furion/issues/I3O5OF)
- [答疑] 定时任务有时能触发有时不能触发 [#I3ORBE](https://gitee.com/dotnetchina/Furion/issues/I3ORBE)
- **不做实现**
- [作废] 框架中的 swagger 是否有提供导出文档为 markdwon/word 的功能计划? [#I3OL8O](https://gitee.com/dotnetchina/Furion/issues/I3OL8O)
- [作废] 数据库实体父子继承,子类生成的 SQL 不一样 [#I3NHU3](https://gitee.com/dotnetchina/Furion/issues/I3NHU3)
- [作废] 支持第三方数据库 ORM [#I3OXA3](https://gitee.com/dotnetchina/Furion/issues/I3OXA3)
---
## v2.1.0 (已发布)
- **新特性**
- [新增] 新增定时任务 `ISpareTimeWorker` 方式支持 `[SpareTime("{配置路径}}]` 方式 [#I3NTUX](https://gitee.com/dotnetchina/Furion/issues/I3NTUX)
- [新增] 定时任务支持异步委托 [#I3NP96](https://gitee.com/dotnetchina/Furion/issues/I3NP96)
- [新增] 轻量级分布式连续 GUID 生成器 [#I3NKLZ](https://gitee.com/dotnetchina/Furion/issues/I3NKLZ)
- [新增] `ClayObject` 模块,处理 `ExpandoObject` 及 `IDictionary<string,object>` 类型 [#I3N3J4](https://gitee.com/dotnetchina/Furion/issues/I3N3J4)
- [新增] `Scoped.CreateUnitOfWork(handler)` 创建作用域并自动提交数据库更改方法 [#I3NU3G](https://gitee.com/dotnetchina/Furion/issues/I3NU3G)
- **突破性变化**
- [调整] 规范化结果接口 `OnResponseStatusCodes` 方法,新增 `UnifyResultStatusCodesOptions` 参数 [#I3NDB9](https://gitee.com/dotnetchina/Furion/issues/I3NDB9)
- [移除] **雪花 ID 实现代码 [#I3NKLZ](https://gitee.com/dotnetchina/Furion/issues/I3NKLZ)**
- **问题修复**
- [修复] `Swagger` 不能支持非 int 类型的枚举 [#I3NQM8](https://gitee.com/dotnetchina/Furion/issues/I3NQM8)
- [修复] 数据库线程池多线程并发问题 [#I3NR4L](https://gitee.com/dotnetchina/Furion/issues/I3NR4L)
- [修复] 自定义控制器路由后且为方法参数指定了 `[ApiSeat]` 后生成路由重复 [#I3NRF6](https://gitee.com/dotnetchina/Furion/issues/I3NRF6)
- **其他更改**
- [改进] 支持应用启动的时候迁移种子数据 [#I3NH3M](https://gitee.com/dotnetchina/Furion/issues/I3NH3M)
- **文档变化**
- [新增] 分布式 ID 生成文档 [#I3B6CX](https://gitee.com/dotnetchina/Furion/issues/I3B6CX)
- [新增] 新增模块化开发文档 [#I3NSUS](https://gitee.com/dotnetchina/Furion/issues/I3NSUS)
- [更新] 20.4 字符串拓展方式 > 错误`ToAESDecrypt` 写成了 `ToToAESDecrypt` [#](https://gitee.com/dotnetchina/Furion/issues/I3NNKV)
- **问答答疑**
- [答疑] 有关【定时任务/委托】的疑问 [#I3N3EW](https://gitee.com/dotnetchina/Furion/issues/I3N3EW)
- [答疑] 统一返回格式支持自定义 [#I3NU1G](https://gitee.com/dotnetchina/Furion/issues/I3NU1G)
- **不做实现**
- [作废] 期待 IEnumerableExtensions 扩展 OrderBy 函数来支持分页排序 [#I3NOQ9](https://gitee.com/dotnetchina/Furion/issues/I3NOQ9)
---
## v2.0.0 (已发布)
- **新特性**
- [新增] 控制台应用程序及 Worker Services 支持 [#I3K4DG](https://gitee.com/dotnetchina/Furion/issues/I3K4DG)
- [新增] 完整任务调度功能 [#I3IRUX](https://gitee.com/dotnetchina/Furion/issues/I3IRUX)
- [新增] `Cron` 表达式解析 [#I3IQ9Y](https://gitee.com/dotnetchina/Furion/issues/I3IQ9Y)
- [新增] 支持 `Swagger` 自定义配置 `swagger.json` 地址模板 [#I3IHMX](https://gitee.com/dotnetchina/Furion/issues/I3IHMX)
- [新增] 支持配置动态 WebApi 区域 [#I3IJAZ](https://gitee.com/dotnetchina/Furion/issues/I3IJAZ)
- [新增] 远程请求新增支持传入服务提供器 `IServiceProvider` [#I3IVBL](https://gitee.com/dotnetchina/Furion/issues/I3IVBL)
- [新增] 全局配置选型 `SupportPackageNamePrefixs` 配置,支持配置包前缀 [#I3K0SN](https://gitee.com/dotnetchina/Furion/issues/I3K0SN)
- [新增] 应用启动时支持 `referenceassembly` 类型程序集扫描 [#I3K0SN](https://gitee.com/dotnetchina/Furion/issues/I3K0SN)
- [新增] 依赖注入 `AOP` 拦截获取方法真实特性 [#I3LZBX](https://gitee.com/dotnetchina/Furion/issues/I3LZBX)
- [新增] EFCore 手动 `SaveChanges()` 特性 [#I3N01Y](https://gitee.com/dotnetchina/Furion/issues/I3N01Y)
- [新增] 支持 `Cors` 跨域更多配置 [#I3N2J0](https://gitee.com/dotnetchina/Furion/issues/I3N2J0)
- **突破性变化**
- [重构] 完整任务调度功能 [#I3IRUX](https://gitee.com/dotnetchina/Furion/issues/I3IRUX)
- [重构] 日志模块功能 [#I3J2K0](https://gitee.com/dotnetchina/Furion/issues/I3J2K0)
- [重构] 模板引擎功能 [#I3J46E](https://gitee.com/dotnetchina/Furion/issues/I3J46E)
- [重构] 底层 `EFCoreRepository` 仓储 [#I3J6W5](https://gitee.com/dotnetchina/Furion/issues/I3J6W5)
- [重构] sql 字符串拓展底层代码 [#I3IVCE](https://gitee.com/dotnetchina/Furion/issues/I3IVCE)
- [重构] 底层 `SqlRepository` 所有逻辑代码 [#I3J6V6](https://gitee.com/dotnetchina/Furion/issues/I3J6V6)
- [重构] 数据库实体拓展方法 [#I3J609](https://gitee.com/dotnetchina/Furion/issues/I3J609)
- [调整] 事件事件总线同步执行为异步方式执行 [#I3J0WA](https://gitee.com/dotnetchina/Furion/issues/I3J0WA)
- [移除] 框架底层 `HttpContext.IsAjaxRequest()` 拓展 [#I3IVAA](https://gitee.com/dotnetchina/Furion/issues/I3IVAA)
- [移除] `ValidationTypes.Required` 验证 [#I3KR85](https://gitee.com/dotnetchina/Furion/issues/I3KR85)
- **问题修复**
- [修复] 关闭 `InjectMiniProfiler` 参数后内存缓存无效 [#I3IHLR](https://gitee.com/dotnetchina/Furion/issues/I3IHLR)
- [修复] 在多租户中调用 `Tenant` 属性出现偶然性数据库上下文被释放的情况 [#I3IC70](https://gitee.com/dotnetchina/Furion/issues/I3IC70)
- [修复] Sql 代理中如果返回基元类型抛出不能将 object 转换成对应类型的异常 [#I3IC84](https://gitee.com/dotnetchina/Furion/issues/I3IC84)
- [修复] 存储过程多返回值的时候,outputvalues 的 name 不是定义的 MSG 的 name,是 Msg 类型。 [#I3IC7Y](https://gitee.com/dotnetchina/Furion/issues/I3IC7Y)
- [修复] PhoneNumber 手机号验证正则表达式错误 [#I3ID10](https://gitee.com/dotnetchina/Furion/issues/I3ID10)
- [修复] 依赖注入 AOP 拦截无法捕获内部异常 [#I3IGCC](https://gitee.com/dotnetchina/Furion/issues/I3IGCC)
- [修复] 全局拦截标记异常已被处理后异常过滤器依然执行 [#I3J463](https://gitee.com/dotnetchina/Furion/issues/I3J463)
- [修复] 自定义全局异常拦截器不起作用 [#I3K1SJ](https://gitee.com/dotnetchina/Furion/issues/I3K1SJ)
- [修复] 在 WorkerService 模式下,还是使用 WebHostEnvironment 来判断 Host 环境,会导致错误 [#I3LCQY](https://gitee.com/dotnetchina/Furion/issues/I3LCQY)
- [修复] 定时任务 `DoOnce` 抛空异常 bug [#I3M0ZT](https://gitee.com/dotnetchina/Furion/issues/I3M0ZT)
- **其他更改**
- [改进] 启动时程序集扫描类型 [#I3K0SN](https://gitee.com/dotnetchina/Furion/issues/I3K0SN)
- [改进] `App.GetConfig<>("key")` 不支持获取单个值问题 [#I3ILF1](https://gitee.com/dotnetchina/Furion/issues/I3ILF1)
- [改进] UrlEncode 应该用 `Uri.EscapeDataString()` 而不是 `HttpUtility.UrlEncode` [#I3ICTK](https://gitee.com/dotnetchina/Furion/issues/I3ICTK)
- **文档变化**
- [新增] 定位任务、后台任务文档 [#I3JHHG](https://gitee.com/dotnetchina/Furion/issues/I3JHHG)
- [新增] 辅组角色服务文档 [#I3K5GN](https://gitee.com/dotnetchina/Furion/issues/I3K5GN)
- [更新] 动态 WebAPI、规范化文档、数据库上下文文档
- **问答答疑**
- [答疑] 数据校验,自定义 ErrorMessage 无效问题 [#I3ICL3](https://gitee.com/dotnetchina/Furion/issues/I3ICL3)
- [答疑] 最新 issue 中新增的“新增常用的 JSON 序列化方法” 会导致 AOP 拦截异常 [#I3I7VE](https://gitee.com/dotnetchina/Furion/issues/I3I7VE)
- [答疑] Furion.DatabaseAccessor.PrivateEntityBase 中的 TenantId 数据类型设置为 object [#I3IQV6](https://gitee.com/dotnetchina/Furion/issues/I3IQV6)
- [答疑] 有关异常拦截和处理的疑问 [#I3IUFZ](https://gitee.com/dotnetchina/Furion/issues/I3IUFZ)
- [答疑] `DataValidation` 在空值的情况下被忽略掉了[#I3IWSM](https://gitee.com/dotnetchina/Furion/issues/I3IWSM)
- [答疑] 日志文档没有更新 [#I3J1DX](https://gitee.com/dotnetchina/Furion/issues/I3J1DX)
- [答疑] 对于 webapi 简单类型参数,是否可以以 json 方式提交 [#I3J18I](https://gitee.com/dotnetchina/Furion/issues/I3J18I)
- [答疑] `IUnifyResultProvider` 实现中如果 `UnifyModel` 的 type 不是范型会报错 [#I3JBXF](https://gitee.com/dotnetchina/Furion/issues/I3JBXF)
- [答疑] 如何模块化开发新功能? [#I3J7ZZ](https://gitee.com/dotnetchina/Furion/issues/I3J7ZZ)
- [答疑] 建议增加微服务中间件的集成 [#I3JTZQ](https://gitee.com/dotnetchina/Furion/issues/I3JTZQ)
- [答疑] 二级虚拟目录部署的 swagger 的 MiniProfiler js 报错 [#I3IWLR](https://gitee.com/dotnetchina/Furion/issues/I3IWLR)
- [答疑] 在启用数据库懒加载后, 获取仓储对象抛出异常 [#I3MYQP](https://gitee.com/dotnetchina/Furion/issues/I3MYQP)
- **不做实现**
- [作废] 在请求审计日志中对贴有 DisableAuditing 特性的字段自动过滤 [#I3DHAN](https://gitee.com/dotnetchina/Furion/issues/I3DHAN)
---
## v1.19.0 (已发布)
- **新特性**
- [新增] `EFCore 5.0` 支持 **SqlServer 2005-2008** 数据库 [#I3HZZ6](https://gitee.com/dotnetchina/Furion/issues/I3HZZ6)
- [新增] `Sql` 高级代理支持模板替换了 [#I3HHWU](https://gitee.com/dotnetchina/Furion/issues/I3HHWU) [#I3HH2T](https://gitee.com/dotnetchina/Furion/issues/I3HH2T)
- [新增] `PBKDF2` 加密 [#I3HN7A](https://gitee.com/dotnetchina/Furion/issues/I3HN7A)
- [新增] 常用的 `JSON` 操作方法 [#I3HUYO](https://gitee.com/dotnetchina/Furion/issues/I3HUYO)
- [新增] 所有解析服务的方法都支持传入 `IServiceProvidier` 参数 [#I3HXEU](https://gitee.com/dotnetchina/Furion/issues/I3HXEU)
- **突破性变化**
- [升级] .NET 5 SDK 至 5.0.5 版本
- **问题修复**
- [修复] 远程请求 `application/x-www-form-urlencoded` 自动被转码了 [#I3HDPC](https://gitee.com/dotnetchina/Furion/issues/I3HDPC)
- [修复] `ISqlDispatchProxy` 调用带返回值的存储过程出错 [#I3HISS](https://gitee.com/dotnetchina/Furion/issues/I3HISS)
- [修复] 多数据库工作单元异常无法回滚数据 [#I3I2KN](https://gitee.com/dotnetchina/Furion/issues/I3I2KN) [#I3HYN5](https://gitee.com/zuohuaijun/Admin.NET/issues/I3HYN5)
- [修复] Serilog 日志生成太多文件 [#I3I2PN](https://gitee.com/dotnetchina/Furion/issues/I3I2PN)
- [修复] `1.18.0` 版本数据库连接池存在连接泄漏问题 [#I3I5KO](https://gitee.com/dotnetchina/Furion/issues/I3I5KO)
- [修复] Sqlite 提示事务已完成异常 [#I3I9F2](https://gitee.com/dotnetchina/Furion/issues/I3I9F2)
- **其他更改**
- [改进] 视图模板功能,默认支持可枚举泛型类型 [#I3GYEE](https://gitee.com/dotnetchina/Furion/issues/I3GYEE)
- [改进] 开发阶段 MiniProfiler 打印数据库相关信息 [#I3I8VQ](https://gitee.com/dotnetchina/Furion/issues/I3I8VQ)
- [改进] EFCore 5.0 未提供 Sqlite 数据库 DataAdapter 的支持 [#I3I9FC](https://gitee.com/dotnetchina/Furion/issues/I3I9FC)
- **文档变化**
- [更新] 数据库上下文、多租户、仓储、日志、序列化等文档。
- **问答答疑**
- [答疑] 建议 MVC 模式下增加 Furion 的功能 [#I3GY4R](https://gitee.com/dotnetchina/Furion/issues/I3GY4R)
- [答疑] 数据库关联操作 [#I3H5QP](https://gitee.com/dotnetchina/Furion/issues/I3H5QP)
- [答疑] 1.17.5 版本 suagger 无法生成 swagger.json [#I3HGPZ](https://gitee.com/dotnetchina/Furion/issues/I3HGPZ)
- [答疑] Serilog 扩展+dll 启动与 swagger 的 MiniProfiler 冲突 [#I3HWJM](https://gitee.com/dotnetchina/Furion/issues/I3HWJM)
- [答疑] Sql 高级代理返回 DataTable 时,结果为空取不到记录 [#I3HUWG](https://gitee.com/dotnetchina/Furion/issues/I3HUWG)
- [答疑] Task.Run 操作数据库问题 [#I3HZ9D](https://gitee.com/dotnetchina/Furion/issues/I3HZ9D)
- **不做实现**
---
## v1.18.0 (已发布)
- **新特性**
- [新增] `Oracle` 11 版本支持 [#I3EVL5](https://gitee.com/dotnetchina/Furion/issues/I3EVL5)
- [新增] `Mysql` 官方包 `MySql.EntityFrameworkCore` 支持 [#I3E6J1](https://gitee.com/dotnetchina/Furion/issues/I3E6J1)
- [新增] 全局配置 `WebApi` 参数 `[FromQury]` 化 [#I3EFYJ](https://gitee.com/dotnetchina/Furion/issues/I3EFYJ)
- [新增] 公开框架底层依赖注入扫描注册拓展 `services.AddRisterTypes(types)` [#I3EIV3](https://gitee.com/dotnetchina/Furion/issues/I3EIV3)
- [新增] SqlSugar 工作单元特性 [#I3EJO5](https://gitee.com/dotnetchina/Furion/issues/I3EJO5)
- **突破性变化**
- **问题修复**
- [修复] 数据库上下文池一旦有上下文操作失败还数据库上下文出现二次提交数据库的问题 [#I3EIJJ](https://gitee.com/dotnetchina/Furion/issues/I3EIJJ)
- [修复] 不同数据库命令参数前缀都添加了 `@` 处理 [#I3EBJP](https://gitee.com/dotnetchina/Furion/issues/I3EBJP)
- [修复] 尝试修复事件总线线程安全问题 [#I3EGSB](https://gitee.com/dotnetchina/Furion/issues/I3EGSB) [#PR236](https://gitee.com/dotnetchina/Furion/pulls/236)
- [修复] `HttpContextExtensions` 的 `SignoutToSwagger` 方法无效 [#I3EHNQ](https://gitee.com/dotnetchina/Furion/issues/I3EHNQ)
- [修复] 如果动态 WebApi 贴了 `[ApiController]` 特性后,导致路由参数重复生成 [#I3EOQQ](https://gitee.com/dotnetchina/Furion/issues/I3EOQQ)
- [修复] 如果没有任何 webapi 控制器时,文档报错 [#I3EVLB](https://gitee.com/dotnetchina/Furion/issues/I3EVLB)
- [修复] 依赖注入泛型类型注册失败 [#I3EX66](https://gitee.com/dotnetchina/Furion/issues/I3EX66)
- **其他更改**
- [调整] SqlSugar 拓展库仓储 `Context` 属性类型未 `SqlSugarClient` [#I3EHXA](https://gitee.com/dotnetchina/Furion/issues/I3EHXA)
- [改进] 刷新 Token 黑名单 Redis 中分组 [#I3EQWO](https://gitee.com/dotnetchina/Furion/issues/I3EQWO)
- [改进] 远程请求在请求拦截次发起二次请求导致异常问题 [#I3ER71](https://gitee.com/dotnetchina/Furion/issues/I3ER71)
- [改进] 多租户默认缓存改为分布式缓存 [#I3EXEU](https://gitee.com/dotnetchina/Furion/issues/I3EXEU)
- **文档变化**
- [更新] 数据库操作文档 [#I3E84X](https://gitee.com/dotnetchina/Furion/issues/I3E84X)
- **问答答疑**
- [答疑] 如何方便的获取 `IDynamicApiController` API 产生的 url 和 谓词 [#I3ED17](https://gitee.com/dotnetchina/Furion/issues/I3ED17)
- [答疑] Code First -执行命令 `Add-Migration` 遇到了问题 [#I3EHD0](https://gitee.com/dotnetchina/Furion/issues/I3EHD0)
- [答疑] tools v1.16.0 无法生成实体,一直提示 Missing required argument `<PROVIDER>`. [#I3ENZ8](https://gitee.com/dotnetchina/Furion/issues/I3ENZ8)
- [答疑] Authorize 的 Logout 按钮,无法实时请空 token[#I3EOF9](https://gitee.com/dotnetchina/Furion/issues/I3EOF9)
- **不做实现**
---
## v1.17.0 (已发布)
- **新特性**
- [新增] 动态 WebAPI 支持继承基类配置特性 [#I3D5PX](https://gitee.com/dotnetchina/Furion/issues/I3D5PX)
- [新增] 远程请求支持 `multipart/form-data` 内容类型处理 [#I3D7KG](https://gitee.com/dotnetchina/Furion/issues/I3D7KG)
- [新增] 字符串加密拓展 [#I3DHBW](https://gitee.com/dotnetchina/Furion/issues/I3DHBW)
- [新增] 新增远程请求可直接下载返回值内容转为 string 类型 [#I3DIGR](https://gitee.com/dotnetchina/Furion/issues/I3DIGR)
- [新增] 远程请求地址支持模板引擎 [#I3D5Y8](https://gitee.com/dotnetchina/Furion/issues/I3D5Y8)
- [新增] `[DataValidation]` 错误消息支持 `string.Format` 操作 [#I3E08W](https://gitee.com/dotnetchina/Furion/issues/I3E08W)
- [新增] 远程请求 `HttpRequestMessage` 拓展方法 `AppendQueries()` 追加更多 `query` 参数拓展 [#I3E3DI](https://gitee.com/dotnetchina/Furion/issues/I3E3DI)
- **突破性变化**
- [调整] `IRepository.AsAsyncEnumerable()` 返回值 [#I3DIQ1](https://gitee.com/dotnetchina/Furion/issues/I3DIQ1),调整为:`rep.AsQueryable().ToListAsync()`
- **问题修复**
- [修复] 数据验证失败后也打印了成功的字段 [#I3CVBS](https://gitee.com/dotnetchina/Furion/issues/I3CVBS)
- [修复] 远程请求配置 `contentType` 为 `application/x-www-form-urlencoded` 无效问题[#I3CWBS](https://gitee.com/dotnetchina/Furion/issues/I3CWBS)
- [修复] 远程请求无法打印完整的请求地址,比如配置了 HttpClient 之后 [#I3CY42](https://gitee.com/dotnetchina/Furion/issues/I3CY42)
- [修复] 程序启动时排除默认配置文件算法不对,应该采用正则表达式匹配 [#I3D9E7](https://gitee.com/dotnetchina/Furion/issues/I3D9E7)
- [修复] 远程请求成功请求拦截不生效 [#I3DOE4](https://gitee.com/dotnetchina/Furion/issues/I3DOE4)
- [修复] `Dapper` 拓展数据库切换为 oracle 时,系统找不到指定的文件 `Oracle.ManagedDataAccess.Core` [#I3DYM3](https://gitee.com/dotnetchina/Furion/issues/I3DYM3)
- **其他更改**
- [改进] 获取 `JWT token` 信息支持配置 `Token` 前缀,如 `Bearer ` [#I3DJIV](https://gitee.com/dotnetchina/Furion/issues/I3DJIV)
- [改进] 刷新 Token 黑名单存储方式,将内存缓存调整为分布式缓存 [#I3DPBR](https://gitee.com/dotnetchina/Furion/issues/I3DPBR)
- **文档变化**
- [调整] 远程请求文档 [#I3CPJO](https://gitee.com/dotnetchina/Furion/issues/I3CPJO)
- **问答答疑**
- [答疑] `LinqExpression.And` 没有 2 个参数的方法 [#I3CXKZ](https://gitee.com/dotnetchina/Furion/issues/I3CXKZ)
- [答疑] 异常信息 如何记录到数据库中:) [#I3DDGO](https://gitee.com/dotnetchina/Furion/issues/I3DDGO)
- [答疑] 无键实体选用 `IEntityNotKey` [#I3DWRF](https://gitee.com/dotnetchina/Furion/issues/I3DWRF)
- [答疑] 根据主键删除一条记录不成功,无错误信息 [#I3DWWF](https://gitee.com/dotnetchina/Furion/issues/I3DWWF)
- [答疑] 如何自定义接口返回格式 [#I3DZN6](https://gitee.com/dotnetchina/Furion/issues/I3DZN6)
- [答疑] DynamicApiController 如何在运行时决定是否公开一个 Action [#I3D5UL](https://gitee.com/dotnetchina/Furion/issues/I3D5UL)
- [答疑] `Furion.DatabaseAccessor.DbHelpers` 方法:`ConvertToDbParameters` 是不是应该过滤掉贴 `NotMapped` 的特性 [#I3E2XS](https://gitee.com/dotnetchina/Furion/issues/I3E2XS)
- **不做实现**
- [废弃] 框架是否提供 `ISoftDelete` 类似接口 [#I3CP93](https://gitee.com/dotnetchina/Furion/issues/I3CP93)
---
## v1.16.0 (已发布)
- **新特性**
- [新增] `IDGenerator` 雪花 ID 算法,感谢 [idgenerator](https://gitee.com/yitter/idgenerator) 作者提交 PR [#PR204](https://gitee.com/dotnetchina/Furion/pulls/204) [#I3B60S](https://gitee.com/dotnetchina/Furion/issues/I3B60S)
- [新增] `DbContext` 刷新多租户缓存拓展方法 [#I39N5U](https://gitee.com/dotnetchina/Furion/issues/I39N5U)
- [新增] 自定义配置单个控制器名称规范,如小写路由 [#I3A5XL](https://gitee.com/dotnetchina/Furion/issues/I3A5XL)
- [新增] 获取当前选择区域语言方法 [#I3BSDH](https://gitee.com/dotnetchina/Furion/issues/I3BSDH)
- **突破性变化**
- [升级] .NET 5 SDK 至 5.0.4 版本 [#I3ASTL](https://gitee.com/dotnetchina/Furion/issues/I3ASTL)
- [重构] 远程请求所有功能 [#I2LB7M](https://gitee.com/dotnetchina/Furion/issues/I2LB7M)
- [重构] `JSON` 序列化功能,提供统一的抽象接口,方便自由替换 `JSON` 库 [#I39GT9](https://gitee.com/dotnetchina/Furion/issues/I39GT9)
- [重构] 验证失败返回消息模型及规范化接口验证参数 [#I3AFQW](https://gitee.com/dotnetchina/Furion/issues/I3AFQW)