feat: 框架代码同步 (#173)

Co-authored-by: tk <fiyne1a@dingtalk.com>
This commit is contained in:
2024-08-29 17:21:06 +08:00
committed by GitHub
parent b9b228c9e1
commit c088492cfa
95 changed files with 3055 additions and 2140 deletions

View File

@@ -9,36 +9,64 @@ namespace NetAdmin.Host.Middlewares;
public sealed class SafetyShopHostMiddleware(RequestDelegate next)
{
private static long _connections;
private static bool _hostStopping;
private static bool _trafficOff;
/// <summary>
/// 当前连接数
/// </summary>
public static long Connections => Interlocked.Read(ref _connections);
/// <summary>
/// 是否已停机
/// </summary>
public static bool IsShutdown => Volatile.Read(ref _trafficOff);
/// <summary>
/// 停机处理
/// </summary>
public static void OnStopping()
{
Volatile.Write(ref _hostStopping, true);
Stop();
while (Interlocked.Read(ref _connections) > 0) {
Thread.Sleep(10);
}
}
/// <summary>
/// 系统启机
/// </summary>
public static void Start()
{
Volatile.Write(ref _trafficOff, false);
}
/// <summary>
/// 系统停机
/// </summary>
public static void Stop()
{
Volatile.Write(ref _trafficOff, true);
}
/// <summary>
/// 主函数
/// </summary>
public async Task InvokeAsync(HttpContext context)
{
if (Volatile.Read(ref _hostStopping)) {
if (Volatile.Read(ref _trafficOff) &&
!context.Request.Path.StartsWithSegments($"/{Chars.FLG_PATH_API_RPOBE}")) {
context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
return;
}
_ = Interlocked.Increment(ref _connections);
await next(context).ConfigureAwait(false);
_ = Interlocked.Decrement(ref _connections);
// webSocket链接不参与计算
if (context.Request.Path.StartsWithSegments($"/{Chars.FLG_PATH_WEBSOCKET_PREFIX}")) {
await next(context).ConfigureAwait(false);
}
else {
_ = Interlocked.Increment(ref _connections);
await next(context).ConfigureAwait(false);
_ = Interlocked.Decrement(ref _connections);
}
}
}