From f0ee8af32aed3e94d778b04be626bcdb069ec46f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E5=B0=8F=E5=83=A7?= Date: Tue, 3 Dec 2024 17:00:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=98=8A=20=E5=9F=BA=E4=BA=8E=E5=9F=BA?= =?UTF-8?q?=E4=BA=8E=E4=BB=A4=E7=89=8C=E6=A1=B6=E7=AE=97=E6=B3=95=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=20`RateLimitedStream`=20=E5=B8=A6=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E9=80=9F=E7=8E=87=E9=99=90=E5=88=B6=E7=9A=84=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HttpRemote/Models/RateLimitedStream.cs | 142 +++++++++++++----- .../HttpRemote/Models/RateLimitedStream.cs | 142 +++++++++++++----- 2 files changed, 216 insertions(+), 68 deletions(-) diff --git a/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs b/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs index 90523eb7b2..4ca7ae793b 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 90523eb7b2..4ca7ae793b 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 -- Gitee From 3300f3e058680c21adf0eea42a08ab91438273a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E5=B0=8F=E5=83=A7?= Date: Tue, 3 Dec 2024 17:20:13 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=98=8A=20=E5=8F=91=E5=B8=83=20`v4.9.6?= =?UTF-8?q?.10`=20=E7=89=88=E6=9C=AC=EF=BC=8C=E6=94=B9=E8=BF=9B=20`HTTP`?= =?UTF-8?q?=20=E8=BF=9C=E7=A8=8B=E8=AF=B7=E6=B1=82=20`RateLimitedStream`?= =?UTF-8?q?=20=E5=B8=A6=E5=BA=94=E7=94=A8=E9=80=9F=E7=8E=87=E9=99=90?= =?UTF-8?q?=E5=88=B6=E7=9A=84=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE/bug.yml | 3 ++- framework/Directory.Build.props | 2 +- samples/Furion.Core/Furion.Core.csproj | 4 ++-- templates/FurionApiTemplate/Furion.Template.Api.nuspec | 2 +- .../src/FurionApi.Core/FurionApi.Core.csproj | 6 +++--- templates/FurionAppTemplate/Furion.Template.App.nuspec | 2 +- .../src/FurionApp.Core/FurionApp.Core.csproj | 6 +++--- .../Furion.Template.Blazor.App.nuspec | 2 +- .../src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj | 4 ++-- .../FurionBlazorTemplate/Furion.Template.Blazor.nuspec | 2 +- .../src/FurionBlazor.Core/FurionBlazor.Core.csproj | 4 ++-- .../Furion.Template.BlazorWithWebApi.nuspec | 2 +- .../src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj | 6 +++--- templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec | 2 +- .../src/FurionMvc.Core/FurionMvc.Core.csproj | 4 ++-- templates/FurionRazorTemplate/Furion.Template.Razor.nuspec | 2 +- .../src/FurionRazor.Core/FurionRazor.Core.csproj | 4 ++-- .../Furion.Template.RazorWithWebApi.nuspec | 2 +- .../src/FurionRazorApi.Core/FurionRazorApi.Core.csproj | 6 +++--- .../FurionApiTemplate/Furion.Template.Api.nuspec | 2 +- .../src/FurionApi.Core/FurionApi.Core.csproj | 6 +++--- .../FurionAppTemplate/Furion.Template.App.nuspec | 2 +- .../src/FurionApp.Core/FurionApp.Core.csproj | 6 +++--- .../Furion.SqlSugar.Template.Blazor.App.nuspec | 2 +- .../src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj | 4 ++-- .../FurionBlazorTemplate/Furion.Template.Blazor.nuspec | 2 +- .../src/FurionBlazor.Core/FurionBlazor.Core.csproj | 4 ++-- .../Furion.Template.BlazorWithWebApi.nuspec | 2 +- .../src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj | 6 +++--- .../FurionMvcTemplate/Furion.Template.Mvc.nuspec | 2 +- .../src/FurionMvc.Core/FurionMvc.Core.csproj | 4 ++-- .../FurionRazorTemplate/Furion.Template.Razor.nuspec | 2 +- .../src/FurionRazor.Core/FurionRazor.Core.csproj | 4 ++-- .../Furion.Template.RazorWithWebApi.nuspec | 2 +- .../src/FurionRazorApi.Core/FurionRazorApi.Core.csproj | 6 +++--- tools/Furion.Tools/Directory.Build.props | 2 +- tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj | 2 +- tools/cli.ps1 | 2 +- 38 files changed, 64 insertions(+), 63 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml index 5ddb99f898..2282841207 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 18936d3662..33321fd458 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/samples/Furion.Core/Furion.Core.csproj b/samples/Furion.Core/Furion.Core.csproj index 38ddb7e65e..fde4b89d3b 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 c0bd10bd3f..5afe73559e 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 5595cef92c..c355550565 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 ec719f921e..c9fd4f17e1 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 0c201f65e8..7e43ef7370 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 267383117f..df898da7eb 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 dc9c162761..6ff492c460 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 c26353c95b..c9af25b8d9 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 dc9c162761..6ff492c460 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 becb568f45..18582631cf 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 faea3a931b..4b11d93f6c 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 437525cec9..4946d8a542 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 dc9c162761..6ff492c460 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 5cd69e3c29..ae36517088 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 dc9c162761..6ff492c460 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 7d3cf38af9..ee5a98f452 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 0595ae68f2..efd53c002a 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 d0b9c42b56..85edec3556 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 fa7c7b978f..ddb9b67def 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 d8361fce61..baeb2b6596 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 ac5fe9484d..de328b4119 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 d4e3b878b1..da5dbcd9f2 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 59a01e830c..724bd70873 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 a64ff16abd..59bc541f29 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 8a70ebc7e8..517ee270fa 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 d9d495ed02..5be9e5d50c 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 2b204be82d..629b851ef6 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 0c31e93010..1a15dfad8c 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 8a70ebc7e8..517ee270fa 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 13ca5bbbab..81f28e2277 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 8a70ebc7e8..517ee270fa 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 9afc0f3e4e..59ce837bd8 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 3b3ff4b3e8..2a54a46641 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 8d24d27f1a..0b7d7591a7 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 a21b860751..8e1ba696b8 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 575f4c915a..ffe1f3c429 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 = @" -- Gitee