48 KiB
公共基础设施(Infrastructure 等)—— 功能与代码目录文档
本文档为「公共基础设施层(Infrastructure / RedisService / ApiLogService / Tools / nlog.config)」的完整上下文说明,供其他对话或开发者作为该模块的上下文直接使用。文中所有路径均相对解决方案根目录
d:\BUYUHouDuanNet\BuYu,所有描述均以实际代码为准;未在代码中确认的内容不写入。
一、平台背景与模块位置
- 本平台是「捕鱼 + 棋牌」游戏运营平台的后端,解决方案文件为
Template0524.sln。 - 技术栈:.NET 8 + MongoDB + Redis + RabbitMQ(业务上层使用 DotNetCore.CAP,本层的通用消息封装使用 EasyNetQ)+ SignalR + Ocelot 网关 + NLog + Autofac。
- 网关监听
http://localhost:8001(Gateway/appsettings.json中"urls": "http://*:8001")。 - 各服务端口由 Ocelot 网关
Gateway/ocelot.json配置(与代码一致):- AdminHost = 5241(管理后台)
- UserHost = 5245(用户)
- CustomerHost = 5247(客服)
- ChessGameHost = 5242(棋牌游戏)
- FishRoomHost = 5244(捕鱼房间)
- FishGameHost = 5248(捕鱼游戏)
- 本模块中的项目(除
Tools/RenameUploads为独立可执行工具外)全部是没有独立进程的类库,被打包进上述各业务 Host / Service / Domain / Api 项目运行。
二、模块简介
公共基础设施层是整个后端的技术底座,为 Admin(管理后台)、User(用户)、Customer(客服)、ChessGame(棋牌)、FishGame(捕鱼)等全部业务模块提供横切能力:
- 通用基础设施(
Infrastructure/Common):统一响应模型、业务异常、系统枚举、通用工具扩展、拼音/脱敏/时间戳转换、敏感词过滤、微信 API 帮助类、跨域、HTTP 请求封装、Redis Key 命名约定。 - Web 基础设施(
Infrastructure/CommonInfrastructure、Infrastructure/SharpAbp.Infrastructure.Api):Autofac 自动注册模块、统一BaseController(解析登录用户 / 客户端 IP)、Controller 结果扩展、全局异常中间件、配置与连接串帮助类、熔断器。 - 数据与中间件封装:MongoDB 通用仓储(
MongoRepository)、Redis 缓存与分布式锁封装(RedisHelper)、RabbitMQ 消息发布/订阅封装(RabbitMQHelper)。 - 认证:JWT 生成/校验与 ASP.NET Core 认证接线(
JWTHelper)。 - 定时任务:基于 Cronos 的后台定时任务基类(
ScheduledService)。 - 领域级 Redis 服务:面向前述业务域的 Redis 读写封装(
RedisService)。 - API 日志:把每次 API 请求落库到 MongoDB 的日志服务(
ApiLogService,实际使用实现位于CommonService,详见第七节说明)。 - 运维工具与日志:上传文件批量改名工具(
Tools/RenameUploads)与全服务共用的 NLog 配置(nlog.config)。
三、功能清单(按子项目分组)
3.1 Infrastructure/Common(通用基础库,命名空间 Common)
| 能力 | 关键类 / 文件 | 说明 |
|---|---|---|
| 统一响应模型 | BaseResponse.cs |
BaseCommonResponse(Code + Info)、BaseResponse<T>、ListResponse<T>、PageResponse<T>(含 Count)、PageDataResponse<T>。所有接口统一以该结构返回 |
| 业务异常 | BusinessException.cs |
继承 Exception,带 ErrorCode,供全局异常中间件识别并转成业务错误响应 |
| 响应码枚举 | SystemEnum.cs |
CommonResponseCodeEnum:Success=0、Error=-1、Exception=500、NoAuth=401、NoRole=403、TokenExpire=1000、NoLogin=401、TokenInvalid=12、ParamError=13、SignError=14、ResultNull=15、LowVersion=16、ResultFail=-1 |
| 实例标识 | AppInstanceId.cs |
仅含 string Id,用于区分同一服务的多个实例 |
| Redis Key 生成 | Redis/RedisKeyGenerator.cs |
按服务前缀生成 Key;ServicePrefixes:user→user-service、admin→admin-service、game/fish/chess→game-service、customer→customer-service、common→app-shared(未匹配时兜底 app-shared)。提供 UserKey/AdminKey/GameKey/CustomerKey/CommonKey/GetKey |
| Redis Key 常量 | Redis/RedisKey.cs |
基于 RedisKeyGenerator 的业务 Key 常量,如 MatchingRoom、UserCIDGID(user-service:uid:{0})、LoginCIDUser/CIDUser(user-service:cid:{0})、VerificationCode(user-service:verification_code:{0})、ProductRedis、WeiXin_AccessToken(app-shared:wx_access_token)、WeiXinUser_AccessToken、GameConfig、ActivityConfig、GameRoomIdKey(game-service:room:model:{0}_{1})、DistributedLockPrefix(app-shared🔒)、ChessRoomList、ChessRoomKey、SystemGoldDayKey、CUSTOMER_ONLINE_KEY(customer-service:online)、FishingKillConfig、FishSpawnConfig、访问/流量统计 Key(app-shared:stats:*)。同文件还保留一套旧版常量 RedisKeyConstants(前缀 redis0524:,其中客户在线为 game0524:customer:online) |
| 通用数据模型 | CommonModel/BaseIdName.cs、CommonModel/BaseListPageParam.cs |
BaseIdName(Id/Name);BaseListPageParam(KeyWord/PageIndex/PageSize,带默认值与去空格逻辑) |
| 跨域 | Cors/CorsExtension.cs |
AddCustomCors() 注册名为 Cors 的策略(允许任意来源、任意 Header/Method、允许凭据);UseCustomCors() 启用 |
| 敏感词过滤 | BlockWord/BlockWord.cs、BlockWord/BlockWordHelper.cs |
BlockWord.BlockWordValue 为超大型敏感词表(逗号分隔,含政治/色情/毒品等);BlockWordHelper 基于 ToolGood.Words.StringSearch 提供 IsHaveBlockWord、ReplaceBlockWord、GetBlockWord |
| HTTP 请求封装 | Request/IRequestApi.cs、Request/RequestApi.cs |
基于 RestSharp,IRequestApi:GetAsync、PostAsync、PostFormDataAsync、DownloadFile。构造时从 IHttpContextAccessor 取请求头 token 作为默认头;响应统一提取 code 做日志判断 |
| 微信帮助类 | WX/WXBaseHelper.cs |
读取配置 WXConfig:AppId/Secret/Url;GetAccessToken() 走 /cgi-bin/token(client_credential)并缓存 3600s;GetAccessTokenByCode(js_code) 走 /sns/jscode2session(authorization_code)并缓存 6000s |
| 微信响应模型 | WX/Response/WXBaseResponse.cs、AccessTokenResponse.cs、GZHUserInfoResponse.cs、TicketResponse.cs |
分别对应微信基础响应(errCode/errmsg)、access_token、公众号用户信息、jsapi_ticket |
| 通用工具 | Utils/* |
见下 |
| 表达式扩展 | LinqExtensions.cs |
提供 And/Or/True/False 等动态组合 Expression<Func<T,bool>> 的能力(含 ParameterRebinder) |
Utils 目录关键工具:
ConvertExtension.cs:大量类型转换与业务扩展——ObjToInt/Long/Money/String/Decimal/Date/Bool、时间戳互转(ToTimeStamp/ConvertToDateTime/ToDateTime)、ToJson/ToObject<T>、Clone<T>、Base64、ToHidMobile、IsHandset、ConvertToPinyin(NPinyin)、ToSHA1Encrypt、金额向上/向下取两位(ToCeilingFixed2/ToFloorFixed2/ToCeilingInt)、集合ContainsAll/RemoveRange等。Tool.cs:LockKey(object)(序列化后 MD5,前缀HSCW:RedisLock:)、GetSerialNumber、GetTimeStringRandom、ReplaceWithSpecialChar(脱敏)、SubStringText、PickupImgUrl、NoHTML、RegexSubstring(供 MongoRepository 解析集合名占位符用)、CheckIsUrl、IsIdCard。DateTimeTools.cs:GetDateTimeNow()(把本地时间标记为 UTC)、GetTimeDiffDays、内部DatetimeJsonConverter(yyyy-MM-dd HH:mm:ss序列化)。DateTimeConverterUtf.cs:JsonConverter<DateTime>,写入时把 UTC 转成Asia/Shanghai时区格式化输出。Md5Helper.cs:GetMD5(string)(小写十六进制)。RandomHelper.cs:RandomNumbers、RandomChars、RandomNoRepeatNumber/Chars、GetRandomCode(长度被限制在 4~8)。ValidationHelper.cs:IsValidMobile、IsValidIdCard(含校验位)、IsValidUserName、IsValidPassword、IsPositiveAmount、IsInRange、IsValidLength。ConstValues.cs:LockSecond=5、LockNotice="业务正在处理中,请稍后"、DevModel="dev"。
3.2 Infrastructure/CommonInfrastructure(Web 基础设施,命名空间 CommonInfrastructure)
Middleware/AutofacModule.cs:Module子类,注册泛型MongoBaseRepository<> → IMongoBaseRepository<>、RedisService.RedisService → IRedisService(均InstancePerLifetimeScope);静态方法RegisterServices(builder, serviceAssemblyType)扫描程序集中以Service结尾的类型按接口注册。Controllers/BaseController.cs:继承 MVCController,在OnActionExecuting中解析 JWT Claims:uid→UserId、uname→UserName、dname→DisplayName、avatar→Icon、number→Number,并从请求头X-Forwarded-For(取第一个)或Connection.RemoteIpAddress得到Ip。Response/LoginUser.cs:UserId、UserName、Number、DisplayName、Icon、Source、Ip、Token。Extension/ControllerExtension.cs:Controller 结果扩展——ToResult/ToListResult/ToPageResult(成功)与ToFailResult/ToListFailResult/ToPageFailResult/ToNoLoginResult/ToTokenInvalidResult/ToParamErrorResult(失败)。
3.3 Infrastructure/SharpAbp.Infrastructure.Api(Web/API 基础设施,命名空间 SharpAbp.Infrastructure.Api)
Autofac/ApplicationModule.cs:抽象 AutofacModule。注册MongoBaseRepository<>→IMongoBaseRepository<>;当RegisterMongoBaseService=true(默认)时注册MongoBaseService<> → IMongoBaseService<>;注册RedisService.RedisService → IRedisService;扫描GetServiceAssemblies()中以Service结尾、以Repository结尾的类型按接口注册。子类通过重写CurrentAssembly/GetServiceAssemblies()指定程序集。Controllers/BaseController.cs:[ApiController]抽象控制器;loginUser从User.Claims解析(ClaimTypes.NameIdentifier→userId、ClaimTypes.Name→userName、ClaimTypes.Role→role);GetClientIp()取X-Forwarded-For或远端 IP。同文件含轻量LoginUser(userId/userName/role)。Extensions/ControllerExtensions.cs:与 CommonInfrastructure 同款的 Controller 结果扩展(ToResult系列 /ToFailResult系列),额外ToParamErrorResult带默认文案。Middleware/GlobalExceptionMiddleware.cs:全局异常中间件,UseGlobalExceptionHandler()扩展。按异常类型返回统一 JSON(HTTP 200,结构{code, info, data}):BusinessException→Error、UnauthorizedAccessException→NoAuth、ArgumentException→ParamError、TimeoutException/OperationCanceledException→Error,其它→Exception并记录LogError。Resilience/CircuitBreaker.cs:手写熔断器(Closed/Open/HalfOpen三态),CircuitBreakerOptions(失败阈值 5、断开时长 30s、半开尝试 3、成功阈值 2),CircuitBreakerFactory用ConcurrentDictionary按名缓存;熔断打开时抛CircuitBreakerOpenException。Configuration/ConfigurationHelper.cs:从环境变量读取并拼装连接串。GetConnectionString("mongodb"/"redis"/"rabbitmq"/"mysql"),对应读取MONGODB_*、REDIS_*、RABBITMQ_*、MYSQL_*环境变量;另提供GetString/GetInt/GetBool。Configuration/AppSettings.cs:强类型配置聚合——JwtConfig、CapConfig、RedisConfig、WXConfig、MongoDbSettings、PgSqlConnection。注意其RedisConfig/MongoDbSettings/JwtConfig为独立于其它子项目的简化定义(默认值 localhost/6379 等)。
3.4 Infrastructure/JWTHelper(JWT,命名空间 JWTHelper)
JWTConfig.cs:TokenKey、Issuer、Audience、SecretKey、ValidateIssuer/Audience/IssuerSigningKey/Lifetime。JwtTools.cs:ValidateToken(token)(HmacSha256,要求 Claims 同时含uid、uname)、CreateToken(Claim[])(有效期 60 分钟)、静态GetTokenContent、GetTokenReverseContent(把uid反转读取,用于校验)、GetTokenClaim。JWTExtension.cs:AddCustomJwt(services, configuration)与AddJwt(...)。绑定JwtConfig节点;认证事件:SignalR 的/hubs/、/fishinghub、/fishingroomhub允许从 queryaccess_token取 token,其余从 Header(jwtSettings.TokenKey)取;OnMessageReceived中会校验uid非空(AddCustomJwt版本);OnChallenge统一返回{code=401,msg="fail",info="很抱歉,您无权访问该接口"}且 HTTP 200。Md5Helper.cs:sealed内部工具,Encode(取 MD5 摘要第 4 段 8 字节),用于 token 附加校验(在JWTExtension相关逻辑中引用,当前校验逻辑注释保留)。
3.5 Infrastructure/MongoRepository(MongoDB 仓储,命名空间 MongoRepository / MongoRepository.Attributes / MongoRepository.Config)
MongoBaseEntity.cs:基类实体,Id(_id,Guid.NewGuid("N"))、IsDelete(isdelete)、CreateInfo(OptionUserInfo?)。OptionUserInfo:UserId、UserName、OptionTime(Unix 时间戳,[BsonIgnoreExtraElements])。BsonCollectionAttribute.cs:标注在实体类上,含CollectionName、DataBaseName;集合名支持{yyyyMM}之类日期占位符。Config/MongoDbSettings.cs:IMongoDbSettings/MongoDbSettings(ServerUrl、Username、Password、Database默认data_0524);ServiceDatabases常量:data_0524_user、data_0524_admin、data_0524_fish、data_0524_chess、data_0524_customer。IMongoBaseRepository.cs:通用仓储接口(查询、分页、增删改、聚合等)。MongoBaseRepository.cs:泛型实现MongoBaseRepository<TDocument> where TDocument : MongoBaseEntity。构造时按IMongoDbSettings拼MongoUrl(用户名/密码/库名来自实体的BsonCollectionAttribute.DataBaseName),并EnsureDatabaseAndUser(库不存在则插入并删除一条 temp 文档触发建库)、EnsureIndexes(针对user集合创建BaseInfo.Mobile与RealName.IDCard唯一稀疏索引,用静态集合去重、异常只记警告)。主要公开方法:- 查询:
AsQueryable、GetCollection、FilterBy(表达式/FilterDefinition/投影)、FindOne/FindOneAsync(表达式或 FilterDefinition,可带排序)、FindById/FindByIdAsync、Count/CountAsync。 - 分页:
QueryPage、QueryPageAsync(多种重载,含带skipCount版本)、QueryPageTwoOrderAsync(双排序)。 - 写入:
InsertOne/InsertMany、UpdateById、UpdateMany、ReplaceOne(均含同步/异步,返回(bool ok, string message))。 - 删除:
DeleteOne/DeleteById/DeleteMany(含异步)。 - 聚合/随机:
Aggregate(FilterDefinition, ProjectionDefinition<...,BsonDocument>)、RandomData(expression, count)(AsQueryable().Sample())。
- 查询:
3.6 Infrastructure/RedisHelper(Redis 缓存与分布式锁,命名空间 RedisHelper)
ICache.cs/RedisCache.cs:基于NewLife.Redis(FullRedis)的缓存封装。RedisCache用FullRedis.Create(config.url),MaxMessageSize=16MB;简单类型(string/long/int/bool/double)直存,复杂对象走System.Text.Json序列化。核心能力:- 基础:
Get<T>、GetAll<T>(keys)、Insert<T>(可带int/TimeSpan过期)、Remove、Exists、Clear()、Clear(pattern)、GetPatternKey/GetPatternList<T>、IncrBy、StartPipeline、GetFullRedis。 - Set:
SetAdd/SetContains/SetRemove/SetCount/SetMembers<T>。 - List:
GetList、AddToList、InitDataToList、UpdateDataToList、RemoveFromList。 - Dictionary:
InitDataToDictionary、UpdateDataToDictionary、RemoveFromDictionary、GetFromDictionary、GetListFromDictionary(ByFilter)、GetListCountFromDictionaryByFilter、分页查询(GetPageDescendingListFromDictionary、GetPageListFromDictionary、GetListFromDictionary、GetDescendingListFromDictionary)。 - 临时内容:
AddTempContent/GetTempContent(Key 模板HS:Temp:{0})。
- 基础:
IDistributedLock.cs/DistributedLock.cs:Redis 分布式锁。TryExecute(Action/Func<T>)与异步版本,参数expiry=30s、retry、retryDelay=100ms;用FullRedis.Add(key, value, expiry)抢锁,值为 Guid,finally中「校验值相等再删除」释放;GetLockKey目前原样返回 key。RedisConfig.cs:Host/Port/Password/UserName/Database,ToString()输出Server=..;Password=..;UserName=..;Db=..。RedisUrl.cs:仅string url(承载连接串)。RedisServiceExtension.cs:DI 扩展AddRedisCache(IConfiguration)(Scoped 注册ICache/IDistributedLock)、AddRedisCacheSingleton(IConfiguration)(Singleton)、AddRedisCache(string url)(Singleton)。均先绑定RedisConfig节点生成RedisUrl。
3.7 Infrastructure/RabbitMQHelper(消息封装,命名空间 RabbitMQHelper 等)
RabbitConfig.cs:IRabbitConfig/RabbitConfig——Host(默认49.233.122.91)、VirtualHost(/)、UserName/Password(guest)、ListSubscribe(订阅者类型列表)、MongoDatabaseName、MongoConnectionString、DefaultExchange(hscw.default.topic)、DefaultRegisterWay(singleton)。InitRabbitMQSetup.cs:AddInitMQ(services, Action<RabbitConfig>, logger)——注册IHttpContextAccessor;用RabbitHutch.CreateBus创建 EasyNetQIBus并注册为单例(连接/断开事件打日志);注册IRabbitConfig、ISendMQMessage(Scoped)、MQHostedService(HostedService);按DefaultRegisterWay(singleton/scoped/transient)用TryAdd*注册ListSubscribe中的订阅者类型。ISendMQMessage.cs/SendMQMessage.cs:Send(topic, value)。未连接返回 false;从当前 HTTP 请求头取token放入消息头;构造RabbitMessage,以ExchangeType.Topic向DefaultExchange发布,并把PublishRecord写入 Mongo 集合mq_publish_record。MQHostedService.cs:BackgroundService。遍历ListSubscribe类型的[RabbitMQAttribute]方法生成ConsumerExecutorDescriptor;声明 topic exchange,为每个方法声明队列(名{类名小写}.{方法名小写})并BindAsync到 topic;Advanced.Consume<RabbitMessage>中写ReceiveRecord到mq_receive_record,再用MethodInfo.Invoke(obj, new object[]{ msg.Body.Data, msg.Body.Headers })反射调用订阅方法。IRabbitSubscribe.cs:空标记接口(RabbitMQHelper.Attributes)。Attributes/RabbitMQAttribute.cs:[RabbitMQAttribute(topic)],用于标注订阅方法。RabbitMessage.cs:RecordId(Guid)、Data、Headers。ConsumerExecutorDescriptor.cs:订阅执行描述(MethodInfo、ImplTypeInfo、Attribute、ClassName)。Models/PublishRecord.cs:PublishRecord(发布记录)与ReceiveRecord(接收记录)。Properties/launchSettings.json:IDE 调试用的启动配置(类库本身不独立运行)。
说明:
RabbitMQHelper.csproj引入了DotNetCore.CAP 8.3.4包,但该类的通用消息发布/订阅实现走 EasyNetQ;CAP 主要用于业务 Host 层(配合nlog.config中的capFile输出),此处不展开。
3.8 Infrastructure/ScheduledService(定时任务,命名空间 ScheduledService)
ScheduleConfig.cs:IScheduleConfig<T>/ScheduleConfig<T>——CronExpression(默认* * * * *)、TimeZoneInfo(默认本地)。CronJobService.cs:实现IHostedService, IDisposable。用Cronos的CronExpression.Parse(cron, CronFormat.IncludeSeconds);ScheduleJob计算下次触发时间并用System.Timers.Timer延迟触发DoWork,完成后递归排下一次;DoWork为可重写空方法,异常只记日志。ScheduledServiceExtensions.cs:AddCronJob<T>(options)(T : CronJobService)——校验配置、注册IScheduleConfig<T>单例并AddHostedService<T>()。
3.9 RedisService(领域级 Redis 服务,命名空间 RedisService / RedisService.Param)
IRedisService.cs/RedisService.cs:构造注入ICache。功能分组:- 用户/CID 映射:
GetRedisUserCId/SetRedisUserCId/RemoveRedisUserCId(Keyuser-service:uid:{0});GetLoginUserId/SetLoginUserId/RemoveLoginUserId、GetAllLoginUserIds(Keyuser-service:cid:{0});另有纯内存ConcurrentDictionary实现的GetUserId/SetUserId/RemoveUserId。 - 验证码:
SetVerificationCode(5 分钟过期)/GetVerificationCode/RemoveVerificationCode。 - 配置:
GameConfig、ActivityConfig、FishingKillConfig、FishSpawnConfig(字符串,读写下 Redis)。 - 房间:
SetGameRoom/GetGameRoom/GetGameRoomList/GetGameRoomAllList/RemoveGameRoom/RemoveGameRoomAll(Keygame-service:room:model:{分区}_{房号},另用进程内ConcurrentDictionary做 3 秒读缓存RoomCacheEntry);GetPendingFishRoomId(找用户所在未结束房间)。 - 棋牌房间:
SetChessRoom/GetChessRoom/GetAllChessRooms/GetAllPlayingChessRooms(state==2)/GetPendingChessRoomId/RemoveChessRoom,及清理方法ClearAllChessRooms/ClearAllGameRooms/ClearAllUserMappings/ClearAllLoginUserIds。 - 捕鱼运行时(Key 直接拼接,无服务前缀):玩家金币
gold:{roomId}:{userId}、子弹集合bullets:{roomId}:{userId}、玩家因子factor:{roomId}:{userId}、房间击杀鱼killfish:{roomId}(Set)、任务进度fishing:tasks:{roomId}:{userId}:{taskEvent}、消耗进度fishing:consume:runtime:...、经验进度fishing:exp:runtime:...;相关方法GetPlayerGold/SetPlayerGold、AddBulletId/ExistsBulletId/RemoveBulletId/GetBulletCount/ClearBulletIds、GetPlayerFactor/SetPlayerFactor/RemovePlayerFactor、GetKillFishIds/AddKillFishId/ContainsKillFishId、AddFishingTaskProgress/GetFishingTaskProgress/ClearFishingTaskProgress、AddFishingConsumeProgress/GetFishingConsumeProgress、AddFishingExpProgress/GetFishingExpProgress、ClearFishingRuntimeProgress、ClearPlayerRuntimeData。 - 系统金币日累计:
SetSystemGoldDay/AddSystemGoldDay/GetSystemGoldDay(Keygame-service:fish:gamestatic)。 - 通用:
IncrBy、GetString、SetString。
- 用户/CID 映射:
Param/RedisUserCid.cs:CId、FishRoomCId、UserId、UserName、RoomId、PartitionId、LoginCId。Param/RedisGameRoom.cs:房间模型(RoomId、RoomName、GameType(默认GameTypeEnum.风雷之渊)、RoomLevel、RoomPartition、RoomNumber、MaxPlayerCount(4)、CurrentOnlinePlayerCount、RobotCount、Players、CreateUserId、SystemFactor)。Param/RedisGamePlayer.cs:玩家模型(UserId、UserName、UserNumber、Avatar、IsRedName、Level、Exp、MaxExp、VipLevel、CId、Gold、Diamond、Position、CannonId、WingsId、WarGodId、CannonMultiple、BeginCoin、MaxGold、BeginTime、State、PlayerFactor、TotalRechargeGold、SafeBoxGold、IsBot、IsAfk)。Param/RoomBotFactory.cs:机器人工厂。CreateBot(position, roomConfig, gameConfig, botProfiles)从BotProfileEntity随机取档案生成机器人(金币按最大炮倍 ×100~500 随机、等级/钻石/炮台/翅膀/战神随机);FixedBotSeats当前为空数组(FixedBotSeatsEnabled=false),CreateFixedSeatBots仅在配置固定座位时生效。
3.10 ApiLogService(API 日志类库)
ApiLogService.cs:namespace ApiLogService,ApiLogService : MongoBaseService<ApiLog>, IApiLogService,构造注入IMongoBaseRepository<ApiLog>。ApiLogService.csproj:仅含net8.0(无任何 Package/Project 引用)。
重要事实(务必注意):该目录下的
ApiLogService.cs依赖的MongoBaseService<>、ApiLog、IApiLogService均不在本项目中定义,而ApiLogService.csproj也没有任何引用,且该工程未加入Template0524.sln,因此它无法单独编译,属于历史遗留/重复副本。 实际在运行的 API 日志服务实现位于CommonService/ApiLogService.cs(命名空间CommonService),接口CommonService/IApiLogService.cs,实体CommonDomain/ApiLog.cs。各 Host 的Middleware/ApiLoggingMiddleware.cs通过CommonService.IApiLogService记录日志(详见第七节)。
3.11 Tools/RenameUploads(上传文件批量改名工具)
Program.cs:独立控制台程序(OutputType=Exe)。目标目录写死为F:\Temp\Template0524\AdminSrc\AdminHost\wwwroot\uploads;用「中文道具名 → 数字编号」映射表(propMapping,如改名卡→40001、Vip1专属炮台→40100、雷电之翼→40201、鸿运招财喵→40301、碎片50001、充值档位70000+、钻石档位80001+等)批量把上传图片重命名为编号文件名,遇到目标已存在则跳过,最后打印成功/跳过数量。RenameUploads.csproj:net8.0、OutputType=Exe、关闭隐式 using 与可空引用。
3.12 nlog.config(全服务共用日志配置)
- 变量:
service(环境变量SERVICE_NAME)、instance(环境变量INSTANCE_ID,区分同服务多容器)、logDirectory=logs/${shortdate};日志layout形如${longdate}|service=..|instance=..|级别|logger|message|异常。 - 开关(改文件后 NLog 自动重载):
enableDebug/Info/Warn/Error/Cap/Socket/FishSpawn/Console均默认true。 - targets(
async=true):按级别分文件debugFile/infoFile/warnFile/errorFile、CAP 专用capFile、Socket/SignalR 专用socketFile、出鱼数据专用fishSpawnFile、console,以及blackhole(Null)。 - rules 要点:
- 屏蔽
Microsoft.AspNetCore.*的 Info 及以下流水日志(maxlevel=Info → blackhole, final)。 DotNetCore.CAP.*(minlevel=Debug)单独输出到capFile。- 消息含
[Socket]或 logger 为*.Hubs.*、*MovementFilter输出到socketFile。 - 消息含
[FishSpawnData]输出到fishSpawnFile。 - Debug/Info/Warn/Error 分别落对应文件,
minlevel=Error同时接收 Critical/Fatal;全量minlevel=Info进console。
- 屏蔽
- 文件名格式:
{service}-{instance}-{级别}.log;内部日志logs/nlog-internal.log(internalLogLevel=Warn)。
四、项目结构与技术要点(各 csproj 依赖与关键 NuGet)
所有项目目标框架均为 net8.0(ImplicitUsings=enable、Nullable=enable,RenameUploads 除外)。
| 项目(相对路径) | 关键 NuGet / Framework 引用 | 项目引用(ProjectReference) |
|---|---|---|
Infrastructure/Common/Common.csproj |
Microsoft.AspNetCore.Cors 2.3.0、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Newtonsoft.Json 13.0.3、NPinyin 0.2.6321.26573、RestSharp 112.1.0、ToolGood.Words 3.1.0.3、XAct.Core.PCL 0.0.5014 | Infrastructure/RedisHelper |
Infrastructure/CommonInfrastructure/CommonInfrastructure.csproj |
FrameworkReference Microsoft.AspNetCore.App、Autofac 8.3.0 |
RedisService、Infrastructure/Common |
Infrastructure/JWTHelper/JWTHelper.csproj |
Microsoft.AspNetCore.Authentication.JwtBearer 8.0.15、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Newtonsoft.Json 13.0.3 | 无 |
Infrastructure/MongoRepository/MongoRepository.csproj |
MongoDB.Bson 3.6.0、MongoDB.Driver 3.6.0、MongoDB.Driver.Core 2.30.0 | Infrastructure/Common |
Infrastructure/RabbitMQHelper/RabbitMQHelper.csproj |
DotNetCore.CAP 8.3.4、EasyNetQ 7.8.0、Microsoft.AspNetCore.Http 2.3.0、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Microsoft.Extensions.Logging 9.0.4、MongoDB.Driver 3.6.0 | 无 |
Infrastructure/RedisHelper/RedisHelper.csproj |
Microsoft.Extensions.Configuration.Binder 8.0.2、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Microsoft.Extensions.Logging.Abstractions 9.0.7、NewLife.Redis 6.2.2025.503 | 无 |
Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj |
FrameworkReference Microsoft.AspNetCore.App、Autofac 8.3.0 |
CommonService、RedisService、Infrastructure/Common |
Infrastructure/ScheduledService/ScheduledService.csproj |
Cronos 0.8.4、Microsoft.Extensions.Hosting.Abstractions 9.0.7 | 无 |
RedisService/RedisService.csproj |
无第三方包 | ChessGameSrc/ChessGameDomain、CommonDomain、Infrastructure/RedisHelper、UserSrc/UserDomain |
ApiLogService/ApiLogService.csproj |
无(仅 net8.0) | 无(未加入 sln) |
Tools/RenameUploads/RenameUploads.csproj |
无 | 无(独立 Exe) |
依赖要点:
- 依赖树根:
RedisHelper(最底层,无项目引用)→ 被Common、MongoRepository(间接)、RedisService等使用;Common→ 被MongoRepository、CommonInfrastructure、SharpAbp.Infrastructure.Api等使用。 CommonInfrastructure与SharpAbp.Infrastructure.Api是两套并行的 Web 基础设施,都提供BaseController+ Controller 结果扩展 + Autofac 注册;不同 Host 按需引用(见第七节)。SharpAbp.Infrastructure.Api依赖CommonService(含MongoBaseService<>与真正在用的ApiLogService),其ApplicationModule会自动注册业务 Service/Repository。RedisService属于领域级库,直接反向依赖ChessGameDomain、UserDomain、CommonDomain,因此被各业务 Service/Host 引用。
五、代码目录说明(完整目录树)
说明:以下为本次模块范围内实际存在的全部文件;每个目录/关键文件均带中文注释。
5.1 Infrastructure/Common
Infrastructure/Common/
├── Common.csproj # 通用基础库工程文件(引用 RedisHelper)
├── AppInstanceId.cs # 实例标识模型(string Id)
├── BaseResponse.cs # 统一响应:BaseCommonResponse/BaseResponse<T>/ListResponse<T>/PageResponse<T>/PageDataResponse<T>
├── BusinessException.cs # 业务异常(含 int ErrorCode)
├── LinqExtensions.cs # 表达式树组合扩展(And/Or/True/False 等)
├── SystemEnum.cs # CommonResponseCodeEnum 响应码枚举
├── BlockWord/
│ ├── BlockWord.cs # 超大型敏感词表常量 BlockWordValue
│ └── BlockWordHelper.cs # 敏感词检测/替换/提取(ToolGood.Words)
├── CommonModel/
│ ├── BaseIdName.cs # 通用 Id/Name 模型
│ └── BaseListPageParam.cs # 通用分页参数(KeyWord/PageIndex/PageSize)
├── Cors/
│ └── CorsExtension.cs # 跨域策略 AddCustomCors / UseCustomCors
├── Redis/
│ ├── RedisKey.cs # 业务 Redis Key 常量(含旧版 RedisKeyConstants)
│ └── RedisKeyGenerator.cs # 按服务前缀生成 Redis Key
├── Request/
│ ├── IRequestApi.cs # HTTP 请求接口(RestSharp)
│ └── RequestApi.cs # HTTP 请求实现(带 token 默认头)
├── Utils/
│ ├── ConstValues.cs # 常量(锁时长/提示语/环境标识)
│ ├── ConvertExtension.cs # 类型转换/时间戳/序列化/脱敏/拼音等扩展
│ ├── DateTimeConverterUtf.cs # UTC→Asia/Shanghai 的 JSON 时间转换器
│ ├── DateTimeTools.cs # 时间工具 + DatetimeJsonConverter
│ ├── Md5Helper.cs # MD5 工具
│ ├── RandomHelper.cs # 随机数/随机串工具
│ ├── Tool.cs # 通用工具(锁 Key/脱敏/正则/身份证等)
│ └── ValidationHelper.cs # 校验工具(手机号/身份证/用户名/密码等)
└── WX/
├── WXBaseHelper.cs # 微信 access_token / code2session 获取与缓存
└── Response/
├── AccessTokenResponse.cs # access_token 响应
├── GZHUserInfoResponse.cs # 公众号用户信息响应
├── TicketResponse.cs # jsapi_ticket 响应
└── WXBaseResponse.cs # 微信基础响应(errcode/errmsg)
5.2 Infrastructure/CommonInfrastructure
Infrastructure/CommonInfrastructure/
├── CommonInfrastructure.csproj # Web 基础设施工程(AspNetCore.App + Autofac)
├── Controllers/
│ └── BaseController.cs # MVC 控制器基类:解析登录用户与客户端 IP
├── Extension/
│ └── ControllerExtension.cs # Controller 结果扩展(成功/失败/未登录等)
├── Middleware/
│ └── AutofacModule.cs # Autofac 注册:Mongo 仓储、RedisService、按名注册 Service
└── Response/
└── LoginUser.cs # 登录用户模型(UserId/UserName/.../Ip/Token)
5.3 Infrastructure/JWTHelper
Infrastructure/JWTHelper/
├── JWTHelper.csproj # JWT 工程(JwtBearer + Newtonsoft.Json)
├── JWTConfig.cs # JWT 配置模型
├── JWTExtension.cs # AddCustomJwt / AddJwt 认证接线
├── JwtTools.cs # Token 生成/校验/解析
└── Md5Helper.cs # 内部 MD5 工具(token 校验用)
5.4 Infrastructure/MongoRepository
Infrastructure/MongoRepository/
├── MongoRepository.csproj # MongoDB 仓储工程(MongoDB.Driver 等)
├── BsonCollectionAttribute.cs # 标注集合名与库名(支持 {yyyyMM} 占位)
├── IMongoBaseRepository.cs # 通用仓储接口
├── MongoBaseEntity.cs # 实体基类 + OptionUserInfo
├── MongoBaseRepository.cs # 通用仓储实现(查询/分页/增改删/聚合)
└── Config/
└── MongoDbSettings.cs # Mongo 连接配置 + ServiceDatabases 库名常量
5.5 Infrastructure/RabbitMQHelper
Infrastructure/RabbitMQHelper/
├── RabbitMQHelper.csproj # 消息封装工程(EasyNetQ + DotNetCore.CAP + MongoDB.Driver)
├── RabbitConfig.cs # 消息配置 IRabbitConfig/RabbitConfig
├── InitRabbitMQSetup.cs # AddInitMQ:注册 Bus、订阅者、后台服务
├── ISendMQMessage.cs # 消息发送接口
├── SendMQMessage.cs # 消息发送实现(含发布记录落库)
├── MQHostedService.cs # 后台订阅服务(反射调用 [RabbitMQ] 方法)
├── IRabbitSubscribe.cs # 订阅者标记接口
├── RabbitMessage.cs # 消息体(RecordId/Data/Headers)
├── ConsumerExecutorDescriptor.cs # 订阅执行描述
├── Attributes/
│ └── RabbitMQAttribute.cs # [RabbitMQ(topic)] 订阅特性
├── Models/
│ └── PublishRecord.cs # PublishRecord / ReceiveRecord 记录模型
└── Properties/
└── launchSettings.json # IDE 调试启动配置
5.6 Infrastructure/RedisHelper
Infrastructure/RedisHelper/
├── RedisHelper.csproj # Redis 封装工程(NewLife.Redis)
├── ICache.cs # 缓存接口
├── RedisCache.cs # 缓存实现(FullRedis)
├── IDistributedLock.cs # 分布式锁接口
├── DistributedLock.cs # 分布式锁实现
├── RedisConfig.cs # Redis 配置(Host/Port/Password/...)
├── RedisUrl.cs # Redis 连接串载体
└── RedisServiceExtension.cs # DI 扩展 AddRedisCache / AddRedisCacheSingleton
5.7 Infrastructure/SharpAbp.Infrastructure.Api
Infrastructure/SharpAbp.Infrastructure.Api/
├── SharpAbp.Infrastructure.Api.csproj # API 基础设施工程(AspNetCore.App + Autofac)
├── Autofac/
│ └── ApplicationModule.cs # 抽象 Autofac 模块:仓储/服务/RedisService 自动注册
├── Configuration/
│ ├── AppSettings.cs # 强类型配置聚合(JwtConfig/CapConfig/RedisConfig/WXConfig/MongoDbSettings)
│ └── ConfigurationHelper.cs # 环境变量读取与连接串拼装
├── Controllers/
│ └── BaseController.cs # [ApiController] 基类:loginUser / GetClientIp
├── Extensions/
│ └── ControllerExtensions.cs # Controller 结果扩展
├── Middleware/
│ └── GlobalExceptionMiddleware.cs # 全局异常中间件 + UseGlobalExceptionHandler
└── Resilience/
└── CircuitBreaker.cs # 熔断器(Closed/Open/HalfOpen)+ 工厂
5.8 Infrastructure/ScheduledService
Infrastructure/ScheduledService/
├── ScheduledService.csproj # 定时任务工程(Cronos)
├── CronJobService.cs # 定时任务基类(IHostedService)
├── ScheduleConfig.cs # 调度配置(CronExpression/TimeZoneInfo)
└── ScheduledServiceExtensions.cs # AddCronJob<T> 扩展
5.9 RedisService
RedisService/
├── RedisService.csproj # 领域级 Redis 服务工程
├── IRedisService.cs # 服务接口(缓存/登录态/验证码/房间/捕鱼运行时等)
├── RedisService.cs # 服务实现(基于 ICache)
└── Param/
├── RedisGamePlayer.cs # 捕鱼房间玩家模型
├── RedisGameRoom.cs # 捕鱼房间模型
├── RedisUserCid.cs # 用户/CID 映射模型
└── RoomBotFactory.cs # 机器人生成工厂
5.10 ApiLogService
ApiLogService/
├── ApiLogService.csproj # 仅 net8.0,无引用;未加入 sln(历史遗留)
└── ApiLogService.cs # namespace ApiLogService(未实际使用,实际实现在 CommonService)
5.11 Tools/RenameUploads
Tools/RenameUploads/
├── RenameUploads.csproj # 独立控制台工具工程(net8.0 Exe)
└── Program.cs # 按道具名→编号映射批量重命名上传图片
5.12 根目录日志配置
nlog.config # 全服务共用 NLog 配置(按级别/CAP/Socket/出鱼分文件)
六、关键文件索引
| 文件相对路径 | 职责 |
|---|---|
Infrastructure/Common/BaseResponse.cs |
定义统一响应结构与响应码封装基类 |
Infrastructure/Common/BusinessException.cs |
业务异常类型,供全局异常中间件识别 |
Infrastructure/Common/SystemEnum.cs |
CommonResponseCodeEnum 全局响应码 |
Infrastructure/Common/Redis/RedisKeyGenerator.cs |
按服务前缀生成 Redis Key(含前缀映射表) |
Infrastructure/Common/Redis/RedisKey.cs |
业务 Redis Key 常量集合 |
Infrastructure/Common/Utils/ConvertExtension.cs |
类型转换/时间戳/序列化/脱敏/拼音等通用扩展 |
Infrastructure/Common/Utils/Tool.cs |
通用工具(锁 Key、脱敏、正则、身份证校验) |
Infrastructure/Common/BlockWord/BlockWordHelper.cs |
敏感词检测与替换 |
Infrastructure/Common/WX/WXBaseHelper.cs |
微信 access_token / code2session 获取与缓存 |
Infrastructure/Common/Request/RequestApi.cs |
基于 RestSharp 的 HTTP 请求封装 |
Infrastructure/Common/Cors/CorsExtension.cs |
跨域策略注册与启用 |
Infrastructure/CommonInfrastructure/Controllers/BaseController.cs |
MVC 基类,解析登录用户与 IP |
Infrastructure/CommonInfrastructure/Extension/ControllerExtension.cs |
Controller 统一结果扩展 |
Infrastructure/CommonInfrastructure/Middleware/AutofacModule.cs |
Autofac 服务注册模块 |
Infrastructure/CommonInfrastructure/Response/LoginUser.cs |
登录用户模型 |
Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs |
抽象 Autofac 模块(仓储/服务自动注册) |
Infrastructure/SharpAbp.Infrastructure.Api/Middleware/GlobalExceptionMiddleware.cs |
全局异常中间件 |
Infrastructure/SharpAbp.Infrastructure.Api/Controllers/BaseController.cs |
API 基类(loginUser / GetClientIp) |
Infrastructure/SharpAbp.Infrastructure.Api/Extensions/ControllerExtensions.cs |
Controller 结果扩展 |
Infrastructure/SharpAbp.Infrastructure.Api/Resilience/CircuitBreaker.cs |
熔断器实现与工厂 |
Infrastructure/SharpAbp.Infrastructure.Api/Configuration/ConfigurationHelper.cs |
环境变量读取与连接串拼装 |
Infrastructure/SharpAbp.Infrastructure.Api/Configuration/AppSettings.cs |
强类型配置聚合模型 |
Infrastructure/JWTHelper/JWTExtension.cs |
ASP.NET Core JWT 认证接线 |
Infrastructure/JWTHelper/JwtTools.cs |
Token 生成/校验/解析 |
Infrastructure/JWTHelper/JWTConfig.cs |
JWT 配置模型 |
Infrastructure/MongoRepository/MongoBaseRepository.cs |
通用 MongoDB 仓储实现 |
Infrastructure/MongoRepository/MongoBaseEntity.cs |
Mongo 实体基类 |
Infrastructure/MongoRepository/BsonCollectionAttribute.cs |
集合/库名标注特性 |
Infrastructure/MongoRepository/Config/MongoDbSettings.cs |
Mongo 配置与各服务库名常量 |
Infrastructure/RedisHelper/RedisCache.cs |
Redis 缓存实现 |
Infrastructure/RedisHelper/DistributedLock.cs |
Redis 分布式锁实现 |
Infrastructure/RedisHelper/RedisServiceExtension.cs |
Redis DI 扩展 |
Infrastructure/RabbitMQHelper/InitRabbitMQSetup.cs |
MQ 初始化(Bus/订阅者注册) |
Infrastructure/RabbitMQHelper/MQHostedService.cs |
MQ 后台订阅服务 |
Infrastructure/RabbitMQHelper/SendMQMessage.cs |
MQ 发送实现 |
Infrastructure/RabbitMQHelper/Attributes/RabbitMQAttribute.cs |
订阅方法特性 |
Infrastructure/ScheduledService/CronJobService.cs |
定时任务基类 |
Infrastructure/ScheduledService/ScheduledServiceExtensions.cs |
AddCronJob<T> 扩展 |
RedisService/IRedisService.cs |
领域级 Redis 服务接口 |
RedisService/RedisService.cs |
领域级 Redis 服务实现 |
RedisService/Param/RoomBotFactory.cs |
捕鱼机器人生成工厂 |
ApiLogService/ApiLogService.cs |
API 日志服务(历史副本,实际使用版本在 CommonService) |
Tools/RenameUploads/Program.cs |
上传图片按道具编号批量重命名工具 |
nlog.config |
全服务共用日志配置 |
七、与其他模块的交互
7.1 各基础设施项目被哪些业务项目引用
(以下基于各 *.csproj 的 ProjectReference 实际统计)
Infrastructure/Common(直接引用):CustomerSrc/CustomerService、AdminSrc/AdminService、UserSrc/UserApi、CustomerSrc/CustomerApi;同时被MongoRepository、CommonInfrastructure、SharpAbp.Infrastructure.Api项目引用(传递到各 Host)。Infrastructure/CommonInfrastructure:ChessGameHost、UserSrc/UserService、CustomerSrc/CustomerService、AdminSrc/AdminService、UserSrc/UserApi、FishGameSrc/FishGameHost、FishGameSrc/FishRoomHost、CustomerSrc/CustomerApi。Infrastructure/SharpAbp.Infrastructure.Api:AdminSrc/AdminHost、UserSrc/UserHost、UserSrc/UserApi、CustomerSrc/CustomerHost、CustomerSrc/CustomerApi、ChessGameHost、FishGameSrc/FishGameHost、FishGameSrc/FishRoomHost。Infrastructure/JWTHelper:AdminSrc/AdminHost、AdminSrc/AdminService、UserSrc/UserService、CustomerSrc/CustomerService、CustomerSrc/CustomerApi(认证入口由各 Host 用AddCustomJwt/AddJwt接线)。Infrastructure/MongoRepository:CommonDomain、ChessGameSrc/ChessGameDomain、AdminSrc/AdminDomain、UserSrc/UserDomain、CustomerSrc/CustomerService.Domain、CommonService、AdminSrc/AdminService、AdminSrc/AdminHost、UserSrc/UserService、CustomerSrc/CustomerService、UserSrc/UserApi、CustomerSrc/CustomerApi(几乎全部数据访问层)。Infrastructure/RedisHelper:Infrastructure/Common、RedisService,以及各业务工程通过Common/RedisService间接使用(AdminHost、UserHost等直接引用)。Infrastructure/RabbitMQHelper:AdminSrc/AdminHost、AdminSrc/AdminService、CustomerSrc/CustomerService、CustomerSrc/CustomerApi。Infrastructure/ScheduledService:AdminSrc/AdminHost、UserSrc/UserHost、UserSrc/UserService。RedisService:Infrastructure/SharpAbp.Infrastructure.Api、Infrastructure/CommonInfrastructure、CommonService、AdminSrc/AdminService、UserSrc/UserHost、UserSrc/UserApi、CustomerSrc/CustomerHost、CustomerSrc/CustomerService、CustomerSrc/CustomerApi、FishGameSrc/FishGameService、FishRoomService、ChessGameSrc/ChessGameService。ApiLogService(顶层目录):未被任何csproj引用,且未加入解决方案(见 7.3)。Tools/RenameUploads:未被任何项目引用,是独立可执行工具。
7.2 RabbitMQ / CAP 封装的使用方式
- 本层封装(EasyNetQ):
- 宿主在启动时调用
services.AddInitMQ(config => { config.Host=...; config.ListSubscribe = new List<Type>{ typeof(XxxSubscriber) }; ... })完成 Bus 创建与订阅服务注册。 - 发送方注入
ISendMQMessage,调用Send(topic, value)发布到DefaultExchange(hscw.default.topic,Topic 类型);发布记录写入 Mongomq_publish_record。 - 订阅方在类的方法上标注
[RabbitMQ("topic")]并实现IRabbitSubscribe,把该类注册进ListSubscribe;MQHostedService反射调用,方法签名为(object data, Dictionary<string,string> headers);接收记录写入 Mongomq_receive_record。
- 宿主在启动时调用
- CAP:
RabbitMQHelper.csproj引入了DotNetCore.CAP 8.3.4包;平台整体以 CAP 作为业务级消息(nlog.config中单独输出capFile)。本类库自身实现并不依赖 CAP API。
7.3 Redis Key 约定
- 新约定(
RedisKeyGenerator,实际被RedisService大量使用):{服务前缀}:{业务键},前缀映射为user → user-service、admin → admin-service、game/fish/chess → game-service、customer → customer-service、common → app-shared。 例如登录态user-service:cid:{cid}、用户映射user-service:uid:{userId}、验证码user-service:verification_code:{phone}、微信 access_tokenapp-shared:wx_access_token、房间game-service:room:model:{分区}_{房号}、棋牌房间game-service:chess:room:{roomId}、分布式锁前缀app-shared:lock:。 - 旧约定(
RedisKeyConstants):统一前缀redis0524:,客户在线为game0524:customer:online;属历史定义,保留兼容。 - 捕鱼运行时 Key 由
RedisService直接拼接(无服务前缀),用于高频读写的房间内数据。
7.4 日志配置
- 全服务共用根目录
nlog.config,以环境变量SERVICE_NAME、INSTANCE_ID区分服务与实例,输出到logs/{日期}/{服务}-{实例}-{级别}.log。 - 分级文件:
-debug/-info/-warn/-error.log;另有 CAP 专用-cap.log、Socket/SignalR 专用-socket.log、出鱼数据专用-fishspawn.log;各类开关在配置中以enableXxx变量控制,autoReload=true支持改文件热生效。 - ASP.NET Core 框架自身的 Info 及以下请求流水日志被屏蔽(仅保留 Warn 及以上)。
7.5 API 日志交互(重要)
- API 日志的实际使用链路:各 Host(
AdminHost、UserHost、CustomerHost、ChessGameHost、FishGameHost、FishRoomHost)的Middleware/ApiLoggingMiddleware.cs注入CommonService.IApiLogService,对/api下的非 OPTIONS 请求做请求/响应体缓存与脱敏,构造CommonDomain.ApiLog并InsertOneAsync落库。 ApiLog(CommonDomain/ApiLog.cs)集合名api_log_{yyyyMM}(按月份分集合)、库data_0524,含 IP、token、耗时、URL、方法、Query、Body、Header、状态码、响应体、UA、来源、设备等字段。- 顶层
ApiLogService/目录为历史副本(ApiLogService.csproj空引用、未入 sln、无法独立编译),不应作为该能力的引用来源;类库实现位于CommonService/ApiLogService.cs,接口CommonService/IApiLogService.cs。
(完)