From b7b0ac1f37b2be6548e549d87ec87965233f7cbc Mon Sep 17 00:00:00 2001 From: milimoe Date: Tue, 11 Mar 2025 23:51:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=84=E7=A7=8D=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E7=9A=84=E6=8E=A7=E5=88=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DataRequestController.cs | 132 +--------------- FunGame.Server/Services/DataRequestService.cs | 142 ++++++++++++++++++ .../Architecture/HttpUserContext.cs | 10 ++ .../Controllers/AdapterController.cs | 69 ++++----- .../Controllers/DataRequestController.cs | 56 ++++--- .../Controllers/GamingRequestController.cs | 77 ++++++++++ FunGame.WebAPI/Controllers/UserController.cs | 3 +- FunGame.WebAPI/Interfaces/IUserContext.cs | 7 + FunGame.WebAPI/Models/PayloadModel.cs | 2 +- FunGame.WebAPI/Models/RESTfulAPIModel.cs | 15 ++ FunGame.WebAPI/Program.cs | 31 +++- 11 files changed, 348 insertions(+), 196 deletions(-) create mode 100644 FunGame.Server/Services/DataRequestService.cs create mode 100644 FunGame.WebAPI/Architecture/HttpUserContext.cs create mode 100644 FunGame.WebAPI/Controllers/GamingRequestController.cs create mode 100644 FunGame.WebAPI/Interfaces/IUserContext.cs diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 78a96c4..b060869 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -526,143 +526,13 @@ namespace Milimoe.FunGame.Server.Controller string password = DataRequest.GetDictionaryJsonObject(requestData, "password") ?? ""; string email = DataRequest.GetDictionaryJsonObject(requestData, "email") ?? ""; string verifycode = DataRequest.GetDictionaryJsonObject(requestData, "verifycode") ?? ""; - (msg, returnType, success) = Reg(username, password, email, verifycode, Server.Socket?.ClientIP ?? "", SQLHelper, MailSender); + (msg, returnType, success) = DataRequestService.Reg(username, password, email, verifycode, Server.Socket?.ClientIP ?? "", SQLHelper, MailSender); } resultData.Add("msg", msg); resultData.Add("type", returnType); resultData.Add("success", success); } - public static (string Msg, RegInvokeType RegInvokeType, bool Success) Reg(string username, string password, string email, string verifyCode, string clientIP = "", SQLHelper? sqlHelper = null, MailSender? mailSender = null) - { - string msg = ""; - RegInvokeType type = RegInvokeType.None; - bool success = false; - string clientName = ServerHelper.MakeClientName(clientIP); - - sqlHelper ??= Factory.OpenFactory.GetSQLHelper(); - mailSender ??= Factory.OpenFactory.GetMailSender(); - if (sqlHelper != null) - { - // 如果没发验证码,就生成验证码 - if (verifyCode.Trim() == "") - { - // 先检查账号是否重复 - sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(sqlHelper, username)); - if (sqlHelper.Result == SQLResult.Success) - { - ServerHelper.WriteLine(clientName + " 账号已被注册"); - msg = "此账号名已被使用!"; - type = RegInvokeType.DuplicateUserName; - } - else - { - // 检查邮箱是否重复 - sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(sqlHelper, email)); - if (sqlHelper.Result == SQLResult.Success) - { - ServerHelper.WriteLine(clientName + " 邮箱已被注册"); - msg = "此邮箱已被注册!"; - type = RegInvokeType.DuplicateEmail; - } - else - { - // 检查验证码是否发送过 - sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(sqlHelper, username, email)); - if (sqlHelper.Result == SQLResult.Success && DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime) && (DateTime.Now - RegTime).TotalMinutes < 10) - { - string RegVerifyCode = sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode].ToString() ?? ""; - ServerHelper.WriteLine(clientName + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}"); - type = RegInvokeType.InputVerifyCode; - } - else - { - // 发送验证码,需要先删除之前过期的验证码 - sqlHelper.NewTransaction(); - sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email)); - string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); - sqlHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(sqlHelper, username, email, regVerify)); - if (sqlHelper.Result == SQLResult.Success) - { - sqlHelper.Commit(); - if (mailSender != null) - { - // 发送验证码 - string ServerName = Config.ServerName; - string Subject = $"[{ServerName}] FunGame 注册验证码"; - string Body = $"亲爱的 {username},
感谢您注册[{ServerName}],您的验证码是 {regVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; - string[] To = [email]; - if (mailSender.Send(mailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) - { - ServerHelper.WriteLine(clientName + $" 已向{email}发送验证码:{regVerify}"); - } - else - { - ServerHelper.WriteLine(clientName + " 无法发送验证码", InvokeMessageType.Error); - ServerHelper.WriteLine(mailSender.ErrorMsg, InvokeMessageType.Error); - } - } - else // 不使用MailSender的情况 - { - ServerHelper.WriteLine(clientName + $" 验证码为:{regVerify},请服务器管理员告知此用户"); - } - type = RegInvokeType.InputVerifyCode; - } - else sqlHelper.Rollback(); - } - } - } - } - else - { - // 先检查验证码 - sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(sqlHelper, username, email, verifyCode)); - if (sqlHelper.Result == SQLResult.Success) - { - if (!DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime)) - { - RegTime = General.DefaultTime; - } - // 检查验证码是否过期 - if ((DateTime.Now - RegTime).TotalMinutes >= 10) - { - ServerHelper.WriteLine(clientName + " 验证码已过期"); - msg = "此验证码已过期,请重新注册。"; - sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email)); - type = RegInvokeType.None; - } - else - { - // 注册 - if (verifyCode.Equals(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode])) - { - sqlHelper.NewTransaction(); - ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email); - sqlHelper.Execute(UserQuery.Insert_Register(sqlHelper, username, password, email, clientIP)); - if (sqlHelper.Result == SQLResult.Success) - { - success = true; - msg = "注册成功!请牢记您的账号与密码!"; - sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email)); - sqlHelper.Commit(); - } - else - { - sqlHelper.Rollback(); - msg = "服务器无法处理您的注册,注册失败!"; - } - } - else msg = "验证码不正确,请重新输入!"; - } - } - else if (sqlHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!"; - else msg = "服务器无法处理您的注册,注册失败!"; - } - } - - return (msg, type, success); - } - #endregion #region Login diff --git a/FunGame.Server/Services/DataRequestService.cs b/FunGame.Server/Services/DataRequestService.cs new file mode 100644 index 0000000..5c244bc --- /dev/null +++ b/FunGame.Server/Services/DataRequestService.cs @@ -0,0 +1,142 @@ +using Milimoe.FunGame.Core.Api.Transmittal; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Library.SQLScript.Common; +using Milimoe.FunGame.Core.Library.SQLScript.Entity; +using Milimoe.FunGame.Server.Others; + +namespace Milimoe.FunGame.Server.Services +{ + public class DataRequestService + { + public static (string Msg, RegInvokeType RegInvokeType, bool Success) Reg(string username, string password, string email, string verifyCode, string clientIP = "", SQLHelper? sqlHelper = null, MailSender? mailSender = null) + { + string msg = ""; + RegInvokeType type = RegInvokeType.None; + bool success = false; + string clientName = ServerHelper.MakeClientName(clientIP); + + sqlHelper ??= Factory.OpenFactory.GetSQLHelper(); + mailSender ??= Factory.OpenFactory.GetMailSender(); + if (sqlHelper != null) + { + // 如果没发验证码,就生成验证码 + if (verifyCode.Trim() == "") + { + // 先检查账号是否重复 + sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(sqlHelper, username)); + if (sqlHelper.Result == SQLResult.Success) + { + ServerHelper.WriteLine(clientName + " 账号已被注册"); + msg = "此账号名已被使用!"; + type = RegInvokeType.DuplicateUserName; + } + else + { + // 检查邮箱是否重复 + sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(sqlHelper, email)); + if (sqlHelper.Result == SQLResult.Success) + { + ServerHelper.WriteLine(clientName + " 邮箱已被注册"); + msg = "此邮箱已被注册!"; + type = RegInvokeType.DuplicateEmail; + } + else + { + // 检查验证码是否发送过 + sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(sqlHelper, username, email)); + if (sqlHelper.Result == SQLResult.Success && DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime) && (DateTime.Now - RegTime).TotalMinutes < 10) + { + string RegVerifyCode = sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode].ToString() ?? ""; + ServerHelper.WriteLine(clientName + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}"); + type = RegInvokeType.InputVerifyCode; + } + else + { + // 发送验证码,需要先删除之前过期的验证码 + sqlHelper.NewTransaction(); + sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email)); + string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); + sqlHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(sqlHelper, username, email, regVerify)); + if (sqlHelper.Result == SQLResult.Success) + { + sqlHelper.Commit(); + if (mailSender != null) + { + // 发送验证码 + string ServerName = Config.ServerName; + string Subject = $"[{ServerName}] FunGame 注册验证码"; + string Body = $"亲爱的 {username},
感谢您注册[{ServerName}],您的验证码是 {regVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; + string[] To = [email]; + if (mailSender.Send(mailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) + { + ServerHelper.WriteLine(clientName + $" 已向{email}发送验证码:{regVerify}"); + } + else + { + ServerHelper.WriteLine(clientName + " 无法发送验证码", InvokeMessageType.Error); + ServerHelper.WriteLine(mailSender.ErrorMsg, InvokeMessageType.Error); + } + } + else // 不使用MailSender的情况 + { + ServerHelper.WriteLine(clientName + $" 验证码为:{regVerify},请服务器管理员告知此用户"); + } + type = RegInvokeType.InputVerifyCode; + } + else sqlHelper.Rollback(); + } + } + } + } + else + { + // 先检查验证码 + sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(sqlHelper, username, email, verifyCode)); + if (sqlHelper.Result == SQLResult.Success) + { + if (!DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime)) + { + RegTime = General.DefaultTime; + } + // 检查验证码是否过期 + if ((DateTime.Now - RegTime).TotalMinutes >= 10) + { + ServerHelper.WriteLine(clientName + " 验证码已过期"); + msg = "此验证码已过期,请重新注册。"; + sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email)); + type = RegInvokeType.None; + } + else + { + // 注册 + if (verifyCode.Equals(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode])) + { + sqlHelper.NewTransaction(); + ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email); + sqlHelper.Execute(UserQuery.Insert_Register(sqlHelper, username, password, email, clientIP)); + if (sqlHelper.Result == SQLResult.Success) + { + success = true; + msg = "注册成功!请牢记您的账号与密码!"; + sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email)); + sqlHelper.Commit(); + } + else + { + sqlHelper.Rollback(); + msg = "服务器无法处理您的注册,注册失败!"; + } + } + else msg = "验证码不正确,请重新输入!"; + } + } + else if (sqlHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!"; + else msg = "服务器无法处理您的注册,注册失败!"; + } + } + + return (msg, type, success); + } + } +} diff --git a/FunGame.WebAPI/Architecture/HttpUserContext.cs b/FunGame.WebAPI/Architecture/HttpUserContext.cs new file mode 100644 index 0000000..3032de5 --- /dev/null +++ b/FunGame.WebAPI/Architecture/HttpUserContext.cs @@ -0,0 +1,10 @@ +using System.Security.Claims; +using Milimoe.FunGame.WebAPI.Interfaces; + +namespace Milimoe.FunGame.WebAPI.Architecture +{ + public class HttpUserContext(IHttpContextAccessor httpContextAccessor) : IUserContext + { + public string Username => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier) ?? ""; + } +} diff --git a/FunGame.WebAPI/Controllers/AdapterController.cs b/FunGame.WebAPI/Controllers/AdapterController.cs index eaf118a..32100c4 100644 --- a/FunGame.WebAPI/Controllers/AdapterController.cs +++ b/FunGame.WebAPI/Controllers/AdapterController.cs @@ -3,7 +3,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; -using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Models; namespace Milimoe.FunGame.WebAPI.Controllers @@ -11,64 +10,54 @@ namespace Milimoe.FunGame.WebAPI.Controllers [ApiController] [Route("[controller]")] [Authorize] - public class AdapterController(ILogger logger) : ControllerBase + public class AdapterController(RESTfulAPIModel model, ILogger logger) : ControllerBase { public static ConcurrentDictionary ResultDatas { get; } = []; private readonly ILogger _logger = logger; - [HttpPost("{username}")] - public async Task Post(string username, [FromBody] SocketObject obj) + [HttpPost] + public async Task Post([FromBody] SocketObject obj) { try { - RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance; - if (apiListener != null && apiListener.UserList.ContainsKey(username)) + if (model.RequestID == Guid.Empty) { - RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username]; - if (model.RequestID == Guid.Empty) + Guid uid = Guid.NewGuid(); + model.RequestID = uid; + + using CancellationTokenSource cts = model.SetRequestTimeout(uid); + + try { - Guid uid = Guid.NewGuid(); - model.RequestID = uid; - - int timeoutMilliseconds = 60 * 1000; - CancellationTokenSource cts = new(timeoutMilliseconds); - cts.Token.Register(() => - { - if (model.RequestID == uid) - { - model.RequestID = Guid.Empty; - _logger.LogWarning(" {uid} ʱͷ RequestID", uid); - } - cts.Dispose(); - }); - await model.SocketMessageHandler(model.Socket, obj); - - cts.Cancel(); - cts.Dispose(); - model.RequestID = Guid.Empty; - - if (ResultDatas.TryGetValue(uid, out SocketObject response)) - { - return Ok(response); - } - else - { - return BadRequest("ûκݷء"); - } } - else + catch (TimeoutException) { - return Ok(new SocketObject(SocketMessageType.System, model.Token, "δִϣȴ")); + _logger.LogWarning("ʱ"); + return StatusCode(408); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + return StatusCode(500); + } + finally + { + model.RequestID = Guid.Empty; + } + + if (ResultDatas.TryRemove(uid, out SocketObject response)) + { + return Ok(response); } } - return BadRequest("ûκݷء"); + return BadRequest(new SocketObject(SocketMessageType.System, model.Token, "δִϣȴ")); } catch (Exception e) { _logger.LogError("Error: {e}", e); - return StatusCode(500, "ڲ"); + return StatusCode(500); } } } diff --git a/FunGame.WebAPI/Controllers/DataRequestController.cs b/FunGame.WebAPI/Controllers/DataRequestController.cs index 6e8fb6b..0869b3f 100644 --- a/FunGame.WebAPI/Controllers/DataRequestController.cs +++ b/FunGame.WebAPI/Controllers/DataRequestController.cs @@ -1,9 +1,6 @@ -using System.Collections.Concurrent; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; -using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Models; namespace Milimoe.FunGame.WebAPI.Controllers @@ -11,37 +8,60 @@ namespace Milimoe.FunGame.WebAPI.Controllers [ApiController] [Route("[controller]")] [Authorize] - public class DataRequestController(ILogger logger) : ControllerBase + public class DataRequestController(RESTfulAPIModel model, ILogger logger) : ControllerBase { - public static ConcurrentDictionary ResultDatas { get; } = []; - private readonly ILogger _logger = logger; - [HttpPost("{username}")] - public async Task Post(string username, [FromBody] PayloadModel payload) + [HttpPost] + public async Task Post([FromBody] PayloadModel payload) { try { - RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance; - if (apiListener != null && apiListener.UserList.ContainsKey(username)) + PayloadModel response = new() { - RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username]; - if (model.RequestID == Guid.Empty) + RequestType = payload.RequestType + }; + if (model.RequestID == Guid.Empty) + { + Guid uid = Guid.NewGuid(); + model.RequestID = uid; + + using CancellationTokenSource cts = model.SetRequestTimeout(uid); + Dictionary result = []; + try { - await Task.CompletedTask; - return Ok(payload); + result = await model.DataRequestController.GetResultData(payload.RequestType, payload.Data); } - else + catch (TimeoutException) { - return Ok(new SocketObject(SocketMessageType.System, model.Token, "δִϣȴ")); + _logger.LogWarning("ʱ"); + return StatusCode(408); } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + return StatusCode(500); + } + finally + { + model.RequestID = Guid.Empty; + } + + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + else + { + response.StatusCode = 400; + response.Message = "δִϣȴ"; + return BadRequest(response); } - return BadRequest("ûκݷء"); } catch (Exception e) { _logger.LogError("Error: {e}", e); - return StatusCode(500, "ڲ"); + return StatusCode(500); } } } diff --git a/FunGame.WebAPI/Controllers/GamingRequestController.cs b/FunGame.WebAPI/Controllers/GamingRequestController.cs new file mode 100644 index 0000000..8cdbe48 --- /dev/null +++ b/FunGame.WebAPI/Controllers/GamingRequestController.cs @@ -0,0 +1,77 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.WebAPI.Models; + +namespace Milimoe.FunGame.WebAPI.Controllers +{ + [ApiController] + [Route("[controller]")] + [Authorize] + public class GamingRequestController(RESTfulAPIModel model, ILogger logger) : ControllerBase + { + private readonly ILogger _logger = logger; + + [HttpPost] + public async Task Post([FromBody] PayloadModel payload) + { + try + { + PayloadModel response = new() + { + RequestType = payload.RequestType + }; + if (model.RequestID == Guid.Empty) + { + if (model.NowGamingServer is null) + { + response.StatusCode = 400; + response.Message = "ûеϷ"; + return BadRequest(response); + } + else + { + Guid uid = Guid.NewGuid(); + model.RequestID = uid; + + using CancellationTokenSource cts = model.SetRequestTimeout(uid); + Dictionary result = []; + try + { + result = await model.NowGamingServer.GamingMessageHandler(model, payload.RequestType, payload.Data); + } + catch (TimeoutException) + { + _logger.LogWarning("ʱ"); + return StatusCode(408); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + return StatusCode(500); + } + finally + { + model.RequestID = Guid.Empty; + } + + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + } + else + { + response.StatusCode = 400; + response.Message = "δִϣȴ"; + return BadRequest(response); + } + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + return StatusCode(500); + } + } + } +} diff --git a/FunGame.WebAPI/Controllers/UserController.cs b/FunGame.WebAPI/Controllers/UserController.cs index 51602c7..086ef72 100644 --- a/FunGame.WebAPI/Controllers/UserController.cs +++ b/FunGame.WebAPI/Controllers/UserController.cs @@ -3,7 +3,6 @@ using Microsoft.AspNetCore.Mvc; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.SQLScript.Entity; -using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Services; using Milimoe.FunGame.WebAPI.Architecture; @@ -31,7 +30,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers string email = dto.Email; string verifycode = dto.VerifyCode; - (string msg, RegInvokeType type, bool success) = DataRequestController.Reg(username, password, email, verifycode, clientIP); + (string msg, RegInvokeType type, bool success) = DataRequestService.Reg(username, password, email, verifycode, clientIP); return Ok(new PayloadModel() { diff --git a/FunGame.WebAPI/Interfaces/IUserContext.cs b/FunGame.WebAPI/Interfaces/IUserContext.cs new file mode 100644 index 0000000..7ce4de8 --- /dev/null +++ b/FunGame.WebAPI/Interfaces/IUserContext.cs @@ -0,0 +1,7 @@ +namespace Milimoe.FunGame.WebAPI.Interfaces +{ + public interface IUserContext + { + public string Username { get; } + } +} diff --git a/FunGame.WebAPI/Models/PayloadModel.cs b/FunGame.WebAPI/Models/PayloadModel.cs index eddc113..ab9a777 100644 --- a/FunGame.WebAPI/Models/PayloadModel.cs +++ b/FunGame.WebAPI/Models/PayloadModel.cs @@ -10,7 +10,7 @@ /// /// 状态码 /// - public int StatusCode { get; set; } = 0; + public int StatusCode { get; set; } = 200; /// /// 处理结果 diff --git a/FunGame.WebAPI/Models/RESTfulAPIModel.cs b/FunGame.WebAPI/Models/RESTfulAPIModel.cs index a9b5cd0..5d796bc 100644 --- a/FunGame.WebAPI/Models/RESTfulAPIModel.cs +++ b/FunGame.WebAPI/Models/RESTfulAPIModel.cs @@ -83,5 +83,20 @@ namespace Milimoe.FunGame.WebAPI.Models return await Send(type, msg); } + + public CancellationTokenSource SetRequestTimeout(Guid uid, int timeout = 60000) + { + CancellationTokenSource cts = new(timeout); + cts.Token.Register(() => + { + if (RequestID == uid) + { + RequestID = Guid.Empty; + ServerHelper.WriteLine($"请求 {uid} 超时,已释放 RequestID。", InvokeMessageType.DataRequest); + } + cts.Dispose(); + }); + return cts; + } } } diff --git a/FunGame.WebAPI/Program.cs b/FunGame.WebAPI/Program.cs index e213db1..23fc23d 100644 --- a/FunGame.WebAPI/Program.cs +++ b/FunGame.WebAPI/Program.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.Extensions.Logging.Console; using Microsoft.IdentityModel.Tokens; +using Milimoe.FunGame; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Common.Network; @@ -19,6 +20,8 @@ using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Services; using Milimoe.FunGame.WebAPI.Architecture; +using Milimoe.FunGame.WebAPI.Interfaces; +using Milimoe.FunGame.WebAPI.Models; using Milimoe.FunGame.WebAPI.Services; using Scalar.AspNetCore; @@ -49,19 +52,19 @@ try // 初始化命令菜单 ServerHelper.InitOrderList(); - // 初始化SQLHelper + // 初始化 SQLHelper FunGameSystem.InitSQLHelper(); - // 初始化MailSender + // 初始化 MailSender FunGameSystem.InitMailSender(); - // 读取Server插件 + // 读取 Server 插件 FunGameSystem.GetServerPlugins(); // Add services to the container. WebApplicationBuilder builder = WebApplication.CreateBuilder(args); - // 读取Web API插件 + // 读取 Web API 插件 object[] otherobjs = [builder]; FunGameSystem.GetWebAPIPlugins(otherobjs); @@ -151,6 +154,26 @@ try options.FormatterName = "CustomFormatter"; }); builder.Services.AddSingleton(); + // 其他依赖注入 + builder.Services.AddHttpContextAccessor(); + builder.Services.AddScoped(); + builder.Services.AddSingleton(listener); + builder.Services.AddSingleton(apiListener); + builder.Services.AddScoped(provider => + { + // 从上下文中获取用户名 + IUserContext userContext = provider.GetRequiredService(); + string username = userContext.Username; + + if (apiListener.UserList.ContainsKey(username)) + { + RESTfulAPIModel apiModel = (RESTfulAPIModel)apiListener.UserList[username]; + return apiModel; + } + + throw new NoUserLogonException(); + }); + builder.Services.AddHttpClient(); WebApplication app = builder.Build();