diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml
index 5ddb99f898dda3bf15c2d196cc6f075ee8687e31..2282841207dc7cb3ac12b3fcf402ac8642392350 100644
--- a/.gitee/ISSUE_TEMPLATE/bug.yml
+++ b/.gitee/ISSUE_TEMPLATE/bug.yml
@@ -13,7 +13,8 @@ body:
label: 版本号
description: 请选择项目使用的 Furion 版本?
options:
- - 4.9.6.9 (最新)
+ - 4.9.6.10 (最新)
+ - 4.9.6.9
- 4.9.6.8
- 4.9.6.7
- 4.9.6.6
diff --git a/framework/Directory.Build.props b/framework/Directory.Build.props
index 18936d3662b8b95d80a7acbb916cf18fc6a7eeaa..33321fd45800591cab151f1d0b88f90117d84d9f 100644
--- a/framework/Directory.Build.props
+++ b/framework/Directory.Build.props
@@ -2,7 +2,7 @@
preview
net8.0;net9.0
- 4.9.6.9
+ 4.9.6.10
enable
百小僧
diff --git a/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs b/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs
index 90523eb7b259ac867a002056e826648e227445af..4ca7ae793bed332f75ec78151d05425b4321ccc7 100644
--- a/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs
+++ b/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs
@@ -30,25 +30,44 @@ namespace Furion.HttpRemote;
///
/// 带应用速率限制的流
///
+///
+/// 基于令牌桶算法(Token Bucket Algorithm)实现流量控制和速率限制。
+/// 参考文献:https://baike.baidu.com/item/令牌桶算法/6597000。
+///
public sealed class RateLimitedStream : Stream
{
///
- /// 每秒允许的最大字节数
+ /// 单次读取或写入操作中处理的最大数据块大小
///
- private readonly int _bytesPerSecond;
+ internal const int CHUNK_SIZE = 4096;
+
+ ///
+ /// 每秒允许传输的最大字节数
+ ///
+ internal readonly double _bytesPerSecond;
///
internal readonly Stream _innerStream;
///
- /// 用于精确计时的 实例
+ /// 用于同步访问的锁对象
///
- internal readonly Stopwatch _stopwatch = new();
+ internal readonly object _lockObject = new();
///
- /// 到目前为止已读取或写入的总字节数
+ /// 用来计算时间间隔的计时器
///
- internal long _totalBytesProcessed;
+ internal readonly Stopwatch _stopwatch;
+
+ ///
+ /// 当前可用的令牌数量(字节数)
+ ///
+ internal double _availableTokens;
+
+ ///
+ /// 上次令牌补充的时间戳
+ ///
+ internal long _lastTokenRefillTime;
///
///
@@ -56,8 +75,8 @@ public sealed class RateLimitedStream : Stream
///
///
///
- /// 每秒允许的最大字节数
- public RateLimitedStream(Stream innerStream, int bytesPerSecond)
+ /// 每秒允许传输的最大字节数
+ public RateLimitedStream(Stream innerStream, double bytesPerSecond)
{
// 空检查
ArgumentNullException.ThrowIfNull(innerStream);
@@ -72,8 +91,14 @@ public sealed class RateLimitedStream : Stream
_innerStream = innerStream;
_bytesPerSecond = bytesPerSecond;
- // 启动 Stopwatch 来开始计时
- _stopwatch.Start();
+ // 开始计时
+ _stopwatch = Stopwatch.StartNew();
+
+ // 记录初始时间
+ _lastTokenRefillTime = _stopwatch.ElapsedMilliseconds;
+
+ // 初始化可用令牌数
+ _availableTokens = bytesPerSecond;
}
///
@@ -104,11 +129,14 @@ public sealed class RateLimitedStream : Stream
///
public override int Read(byte[] buffer, int offset, int count)
{
- // 根据设定的速率限制调整读写操作的速度
- ApplyRateLimitAsync(count).GetAwaiter().GetResult();
+ // 确保单次读取不会超过预设的数据块大小
+ var adjustedCount = Math.Min(count, CHUNK_SIZE);
+
+ // 等待直到有足够令牌可用
+ WaitForTokens(adjustedCount);
// 从内部流读取数据到缓冲区
- return _innerStream.Read(buffer, offset, count);
+ return _innerStream.Read(buffer, offset, adjustedCount);
}
///
@@ -120,11 +148,14 @@ public sealed class RateLimitedStream : Stream
///
public override void Write(byte[] buffer, int offset, int count)
{
- // 向内部流写入数据
- _innerStream.Write(buffer, offset, count);
+ // 确保单次写入不会超过预设的数据块大小
+ var adjustedCount = Math.Min(count, CHUNK_SIZE);
- // 根据设定的速率限制调整读写操作的速度
- ApplyRateLimitAsync(count).GetAwaiter().GetResult();
+ // 等待直到有足够令牌可用
+ WaitForTokens(adjustedCount);
+
+ // 向内部流写入数据
+ _innerStream.Write(buffer, offset, adjustedCount);
}
///
@@ -134,35 +165,78 @@ public sealed class RateLimitedStream : Stream
if (disposing)
{
_innerStream.Dispose();
+ _stopwatch.Stop();
}
base.Dispose(disposing);
}
///
- /// 根据设定的速率限制调整读写操作的速度
+ /// 补充令牌的方法
///
- /// 本次操作将处理的字节数
- internal async Task ApplyRateLimitAsync(int bytesToProcess)
+ internal void RefillTokens()
{
- // 自开始以来经过的时间(秒)
- var elapsedSeconds = _stopwatch.ElapsedMilliseconds / 1000.0;
+ // 获取当前计时器的时间
+ var now = _stopwatch.ElapsedMilliseconds;
- // 根据速率预期应读取的字节数
- var totalBytesExpected = elapsedSeconds * _bytesPerSecond;
+ // 计算自上次填充令牌以来经过的时间
+ var timePassed = now - _lastTokenRefillTime;
- // 计算实际与预期之差
- var bytesOverLimit = _totalBytesProcessed + bytesToProcess - totalBytesExpected;
-
- if (bytesOverLimit > 0)
+ // 如果时间没有流逝或者流逝时间不足以产生新的令牌,则直接返回
+ if (timePassed <= 0)
{
- // 如果实际操作超过预期,则计算需要等待的时间,并进行延迟
- var delayMilliseconds = (int)(bytesOverLimit / _bytesPerSecond * 1000.0);
-
- await Task.Delay(delayMilliseconds).ConfigureAwait(false);
+ return;
}
- // 更新已处理的总字节数
- _totalBytesProcessed += bytesToProcess;
+ // 据每秒允许的最大字节数以及经过的时间计算可以补充的令牌数量
+ var newTokens = _bytesPerSecond * timePassed / 1000.0;
+
+ // 更新可用令牌,但不超过每秒允许的最大值
+ _availableTokens = Math.Min(_bytesPerSecond, _availableTokens + newTokens);
+
+ // 更新最后一次填充令牌的时间戳
+ _lastTokenRefillTime = now;
+ }
+
+ ///
+ /// 等待直到有足够令牌可用
+ ///
+ /// 需要等待的令牌数量
+ internal void WaitForTokens(int desiredTokens)
+ {
+ while (true)
+ {
+ // 防止并发访问问题
+ lock (_lockObject)
+ {
+ // 尝试补充令牌
+ RefillTokens();
+
+ // 检查是否已有足够的令牌
+ if (_availableTokens >= desiredTokens)
+ {
+ // 扣除所需的令牌数量
+ _availableTokens -= desiredTokens;
+
+ // 如果有足够的令牌,退出循环
+ return;
+ }
+ }
+
+ // 如果没有足够的令牌,计算还需要多少令牌
+ var requiredTokens = desiredTokens - _availableTokens;
+
+ // 计算为了获得所需令牌需要等待的时间
+ var waitTime = (int)(requiredTokens * 1000.0 / _bytesPerSecond);
+
+ // 添加一点额外延迟用来确保精确性,具体是增加了 5% 的延迟
+ waitTime = (int)(waitTime * 1.05);
+
+ // 确保不会一次性等待过长时间,最多等待 100 毫秒
+ if (waitTime > 0)
+ {
+ Thread.Sleep(Math.Min(100, waitTime));
+ }
+ }
}
}
\ No newline at end of file
diff --git a/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs b/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs
index 90523eb7b259ac867a002056e826648e227445af..4ca7ae793bed332f75ec78151d05425b4321ccc7 100644
--- a/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs
+++ b/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs
@@ -30,25 +30,44 @@ namespace Furion.HttpRemote;
///
/// 带应用速率限制的流
///
+///
+/// 基于令牌桶算法(Token Bucket Algorithm)实现流量控制和速率限制。
+/// 参考文献:https://baike.baidu.com/item/令牌桶算法/6597000。
+///
public sealed class RateLimitedStream : Stream
{
///
- /// 每秒允许的最大字节数
+ /// 单次读取或写入操作中处理的最大数据块大小
///
- private readonly int _bytesPerSecond;
+ internal const int CHUNK_SIZE = 4096;
+
+ ///
+ /// 每秒允许传输的最大字节数
+ ///
+ internal readonly double _bytesPerSecond;
///
internal readonly Stream _innerStream;
///
- /// 用于精确计时的 实例
+ /// 用于同步访问的锁对象
///
- internal readonly Stopwatch _stopwatch = new();
+ internal readonly object _lockObject = new();
///
- /// 到目前为止已读取或写入的总字节数
+ /// 用来计算时间间隔的计时器
///
- internal long _totalBytesProcessed;
+ internal readonly Stopwatch _stopwatch;
+
+ ///
+ /// 当前可用的令牌数量(字节数)
+ ///
+ internal double _availableTokens;
+
+ ///
+ /// 上次令牌补充的时间戳
+ ///
+ internal long _lastTokenRefillTime;
///
///
@@ -56,8 +75,8 @@ public sealed class RateLimitedStream : Stream
///
///
///
- /// 每秒允许的最大字节数
- public RateLimitedStream(Stream innerStream, int bytesPerSecond)
+ /// 每秒允许传输的最大字节数
+ public RateLimitedStream(Stream innerStream, double bytesPerSecond)
{
// 空检查
ArgumentNullException.ThrowIfNull(innerStream);
@@ -72,8 +91,14 @@ public sealed class RateLimitedStream : Stream
_innerStream = innerStream;
_bytesPerSecond = bytesPerSecond;
- // 启动 Stopwatch 来开始计时
- _stopwatch.Start();
+ // 开始计时
+ _stopwatch = Stopwatch.StartNew();
+
+ // 记录初始时间
+ _lastTokenRefillTime = _stopwatch.ElapsedMilliseconds;
+
+ // 初始化可用令牌数
+ _availableTokens = bytesPerSecond;
}
///
@@ -104,11 +129,14 @@ public sealed class RateLimitedStream : Stream
///
public override int Read(byte[] buffer, int offset, int count)
{
- // 根据设定的速率限制调整读写操作的速度
- ApplyRateLimitAsync(count).GetAwaiter().GetResult();
+ // 确保单次读取不会超过预设的数据块大小
+ var adjustedCount = Math.Min(count, CHUNK_SIZE);
+
+ // 等待直到有足够令牌可用
+ WaitForTokens(adjustedCount);
// 从内部流读取数据到缓冲区
- return _innerStream.Read(buffer, offset, count);
+ return _innerStream.Read(buffer, offset, adjustedCount);
}
///
@@ -120,11 +148,14 @@ public sealed class RateLimitedStream : Stream
///
public override void Write(byte[] buffer, int offset, int count)
{
- // 向内部流写入数据
- _innerStream.Write(buffer, offset, count);
+ // 确保单次写入不会超过预设的数据块大小
+ var adjustedCount = Math.Min(count, CHUNK_SIZE);
- // 根据设定的速率限制调整读写操作的速度
- ApplyRateLimitAsync(count).GetAwaiter().GetResult();
+ // 等待直到有足够令牌可用
+ WaitForTokens(adjustedCount);
+
+ // 向内部流写入数据
+ _innerStream.Write(buffer, offset, adjustedCount);
}
///
@@ -134,35 +165,78 @@ public sealed class RateLimitedStream : Stream
if (disposing)
{
_innerStream.Dispose();
+ _stopwatch.Stop();
}
base.Dispose(disposing);
}
///
- /// 根据设定的速率限制调整读写操作的速度
+ /// 补充令牌的方法
///
- /// 本次操作将处理的字节数
- internal async Task ApplyRateLimitAsync(int bytesToProcess)
+ internal void RefillTokens()
{
- // 自开始以来经过的时间(秒)
- var elapsedSeconds = _stopwatch.ElapsedMilliseconds / 1000.0;
+ // 获取当前计时器的时间
+ var now = _stopwatch.ElapsedMilliseconds;
- // 根据速率预期应读取的字节数
- var totalBytesExpected = elapsedSeconds * _bytesPerSecond;
+ // 计算自上次填充令牌以来经过的时间
+ var timePassed = now - _lastTokenRefillTime;
- // 计算实际与预期之差
- var bytesOverLimit = _totalBytesProcessed + bytesToProcess - totalBytesExpected;
-
- if (bytesOverLimit > 0)
+ // 如果时间没有流逝或者流逝时间不足以产生新的令牌,则直接返回
+ if (timePassed <= 0)
{
- // 如果实际操作超过预期,则计算需要等待的时间,并进行延迟
- var delayMilliseconds = (int)(bytesOverLimit / _bytesPerSecond * 1000.0);
-
- await Task.Delay(delayMilliseconds).ConfigureAwait(false);
+ return;
}
- // 更新已处理的总字节数
- _totalBytesProcessed += bytesToProcess;
+ // 据每秒允许的最大字节数以及经过的时间计算可以补充的令牌数量
+ var newTokens = _bytesPerSecond * timePassed / 1000.0;
+
+ // 更新可用令牌,但不超过每秒允许的最大值
+ _availableTokens = Math.Min(_bytesPerSecond, _availableTokens + newTokens);
+
+ // 更新最后一次填充令牌的时间戳
+ _lastTokenRefillTime = now;
+ }
+
+ ///
+ /// 等待直到有足够令牌可用
+ ///
+ /// 需要等待的令牌数量
+ internal void WaitForTokens(int desiredTokens)
+ {
+ while (true)
+ {
+ // 防止并发访问问题
+ lock (_lockObject)
+ {
+ // 尝试补充令牌
+ RefillTokens();
+
+ // 检查是否已有足够的令牌
+ if (_availableTokens >= desiredTokens)
+ {
+ // 扣除所需的令牌数量
+ _availableTokens -= desiredTokens;
+
+ // 如果有足够的令牌,退出循环
+ return;
+ }
+ }
+
+ // 如果没有足够的令牌,计算还需要多少令牌
+ var requiredTokens = desiredTokens - _availableTokens;
+
+ // 计算为了获得所需令牌需要等待的时间
+ var waitTime = (int)(requiredTokens * 1000.0 / _bytesPerSecond);
+
+ // 添加一点额外延迟用来确保精确性,具体是增加了 5% 的延迟
+ waitTime = (int)(waitTime * 1.05);
+
+ // 确保不会一次性等待过长时间,最多等待 100 毫秒
+ if (waitTime > 0)
+ {
+ Thread.Sleep(Math.Min(100, waitTime));
+ }
+ }
}
}
\ No newline at end of file
diff --git a/samples/Furion.Core/Furion.Core.csproj b/samples/Furion.Core/Furion.Core.csproj
index 38ddb7e65e0efab46393e10df38219cc67df9af9..fde4b89d3b84a5e930f54cea121542b014793fe2 100644
--- a/samples/Furion.Core/Furion.Core.csproj
+++ b/samples/Furion.Core/Furion.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/FurionApiTemplate/Furion.Template.Api.nuspec b/templates/FurionApiTemplate/Furion.Template.Api.nuspec
index c0bd10bd3f7fb7f21558df7a666bdc54da463002..5afe73559e4e3ac22100c958d0406eb70760e2d7 100644
--- a/templates/FurionApiTemplate/Furion.Template.Api.nuspec
+++ b/templates/FurionApiTemplate/Furion.Template.Api.nuspec
@@ -2,7 +2,7 @@
Furion.Template.Api
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Api 多层架构模板。
百小僧
diff --git a/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj b/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj
index 5595cef92c7309034a53e5e4ab3fc5885a8d6fee..c355550565300cee1246f4fd54d2740aec729348 100644
--- a/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj
+++ b/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/FurionAppTemplate/Furion.Template.App.nuspec b/templates/FurionAppTemplate/Furion.Template.App.nuspec
index ec719f921ee0522bafa002a05a2e445eee2ff27a..c9fd4f17e1a48337c5fda7f171046d955c94f8ab 100644
--- a/templates/FurionAppTemplate/Furion.Template.App.nuspec
+++ b/templates/FurionAppTemplate/Furion.Template.App.nuspec
@@ -2,7 +2,7 @@
Furion.Template.App
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Mvc/Api 多层架构模板。
百小僧
diff --git a/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj b/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj
index 0c201f65e855be3b70554900166cdc1fbc708ee1..7e43ef7370a1a093fecbcfa7d2b3bc93e4eee940 100644
--- a/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj
+++ b/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec b/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec
index 267383117fd88722b0515aac7b38d6e4f7eee802..df898da7ebc8652f04cdcc7f0201e1be8ffa6216 100644
--- a/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec
+++ b/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec
@@ -2,7 +2,7 @@
Furion.Template.Blazor.App
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Blazor App 多层架构模板。
百小僧
diff --git a/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj b/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj
index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644
--- a/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj
+++ b/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec b/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec
index c26353c95b527b937c3aee15b93dbfd6a4fb9ed4..c9af25b8d95927f67f22b60341dc64bc24d6d543 100644
--- a/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec
+++ b/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec
@@ -2,7 +2,7 @@
Furion.Template.Blazor
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Blazor 多层架构模板。
百小僧
diff --git a/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj b/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj
index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644
--- a/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj
+++ b/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec b/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec
index becb568f456617546576632782242bdfeae550f9..18582631cfedf94f82d69fcae80f64de6a11dc31 100644
--- a/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec
+++ b/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec
@@ -2,7 +2,7 @@
Furion.Template.BlazorWithWebApi
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Blazor和WebApi 多层架构模板。
百小僧
diff --git a/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj b/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj
index faea3a931bc10ba0f47a8bd156f3e2d044a281d9..4b11d93f6c495aa3ee93350be826119eb33c7314 100644
--- a/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj
+++ b/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec b/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec
index 437525cec965f0edc0122ee365a65baf67982a1f..4946d8a5426141515cf39e54a28830f8278c9ddf 100644
--- a/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec
+++ b/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec
@@ -2,7 +2,7 @@
Furion.Template.Mvc
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Mvc 多层架构模板。
百小僧
diff --git a/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj b/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj
index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644
--- a/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj
+++ b/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec b/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec
index 5cd69e3c29721826aced8cc6d6249b8c87e252b2..ae3651708872852f6215fe239712c2dd86c9647c 100644
--- a/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec
+++ b/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec
@@ -2,7 +2,7 @@
Furion.Template.Razor
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 Razor Pages 多层架构模板。
百小僧
diff --git a/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj b/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj
index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644
--- a/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj
+++ b/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec b/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec
index 7d3cf38af969e8cbf964b334acdb41c139548e1d..ee5a98f4527489233afd29f3960ef266fab42ff2 100644
--- a/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec
+++ b/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec
@@ -2,7 +2,7 @@
Furion.Template.RazorWithWebApi
- 4.9.6.9
+ 4.9.6.10
基于 Furion 框架快速搭建 RazorPages和WebApi 多层架构模板。
百小僧
diff --git a/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj b/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj
index 0595ae68f21f7070580e139ef5a54f2f31480d8c..efd53c002a7a0ae5a78cfea2f4abb475a3be5102 100644
--- a/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj
+++ b/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec b/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec
index d0b9c42b5654cbde8b7bee5dc39b59b1e36378b0..85edec3556dbdd0ccccae46c1c9e3a50c50322fd 100644
--- a/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec
+++ b/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.Api
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Api 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj b/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj
index fa7c7b978ffb433557ed7fe66e236c05cc9127c5..ddb9b67defb15a5faaa5757f787d03e5d63eb3a1 100644
--- a/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec b/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec
index d8361fce6139fea0f63b4f0001ee70f463789ee9..baeb2b65966310cd15735bfe552eea3ab5206b49 100644
--- a/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec
+++ b/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.App
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Mvc/Api 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj b/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj
index ac5fe9484d1fa07eda85ff559bb6603d30ebab9d..de328b41194f1d4f536ad11d08ad2424c5d0bf84 100644
--- a/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec
index d4e3b878b176a53df95ca2cf9aa9df58c5fa17e5..da5dbcd9f247f6b32e73a2d74b1a93f31cb771a5 100644
--- a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec
+++ b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.Blazor.App
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Blazor App 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj
index 59a01e830ca61ba394a621b7dd1c9a7127466924..724bd708734866df156d937d385b3ab136f6ddd1 100644
--- a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj
@@ -11,9 +11,9 @@
-
+
-
+
diff --git a/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec b/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec
index a64ff16abd00684beb4a9143c31acde5ea1b5de1..59bc541f29b094706d1d81127b5b7502221aa472 100644
--- a/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec
+++ b/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.Blazor
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Blazor 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj b/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj
index 8a70ebc7e84b437634852da39b97d5278d59daaa..517ee270fa98123a8da2059865252c2a288da532 100644
--- a/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec
index d9d495ed029406f28993658e3a3fe3cd9e8c7551..5be9e5d50c4db0c12e1e8cc798cebe9748c0036a 100644
--- a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec
+++ b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.BlazorWithWebApi
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Blazor和WebApi 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj
index 2b204be82ddf649046158fe4d691cc73b125ab3a..629b851ef6c5d12deb52efdf922831963578b433 100644
--- a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec b/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec
index 0c31e93010a4004987b0370f0e159ac44d861670..1a15dfad8c2f2e6efed9b996a808372bbf282d47 100644
--- a/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec
+++ b/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.Mvc
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Mvc 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj b/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj
index 8a70ebc7e84b437634852da39b97d5278d59daaa..517ee270fa98123a8da2059865252c2a288da532 100644
--- a/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec b/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec
index 13ca5bbbaba55584365e475e7f282d0b75be0678..81f28e227723adf850071f4819f93209388687d8 100644
--- a/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec
+++ b/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.Razor
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 Razor Pages 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj b/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj
index 8a70ebc7e84b437634852da39b97d5278d59daaa..517ee270fa98123a8da2059865252c2a288da532 100644
--- a/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec
index 9afc0f3e4eb6681f98bc996ebbed37b0104b419b..59ce837bd81ed4902aa53f98dfa9d646d247f633 100644
--- a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec
+++ b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec
@@ -2,7 +2,7 @@
Furion.SqlSugar.Template.RazorWithWebApi
- 4.9.6.9
+ 4.9.6.10
基于 Furion 和 SqlSugar 框架快速搭建 RazorPages和WebApi 多层架构模板。
百小僧
diff --git a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj
index 3b3ff4b3e82d58a6b2b9a02edaacc3cb6a2fae19..2a54a4664166ea74a0fa1fbf155306a5969cfb63 100644
--- a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj
+++ b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/tools/Furion.Tools/Directory.Build.props b/tools/Furion.Tools/Directory.Build.props
index 8d24d27f1a4b6fe97fa6118187aac29fff2869df..0b7d7591a7033b0277c5fbdfc37045f3d1c92404 100644
--- a/tools/Furion.Tools/Directory.Build.props
+++ b/tools/Furion.Tools/Directory.Build.props
@@ -2,7 +2,7 @@
preview
net8.0;net9.0
- 4.9.6.9
+ 4.9.6.10
enable
百小僧
diff --git a/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj b/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj
index a21b86075138add450eb41a22436c4313f9ddb68..8e1ba696b82e78c1764105f7375d6c5a9cf5cd3e 100644
--- a/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj
+++ b/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj
@@ -7,7 +7,7 @@
-
+
\ No newline at end of file
diff --git a/tools/cli.ps1 b/tools/cli.ps1
index 575f4c915a42964b26ce95309ee9eb35251266d6..ffe1f3c4290a16ddb214256836d9908e5d04c476 100644
--- a/tools/cli.ps1
+++ b/tools/cli.ps1
@@ -96,7 +96,7 @@ function AddXmlCommentsToProperties($content, $commentsDictionary) {
return $modifiedContent
}
-$FurTools = "Furion Tools v4.9.6.9";
+$FurTools = "Furion Tools v4.9.6.10";
# 输出信息
$copyright = @"