1+ using System . Net ;
12using System . Reflection ;
23using GameFrameX . Foundation . Logger ;
34using GameFrameX . NetWork ;
45using GameFrameX . NetWork . Abstractions ;
56using GameFrameX . NetWork . HTTP ;
67using GameFrameX . NetWork . Message ;
8+ using GameFrameX . StartUp . Options ;
79using GameFrameX . SuperSocket . Connection ;
810using GameFrameX . SuperSocket . Primitives ;
911using GameFrameX . SuperSocket . ProtoBase ;
12+ using GameFrameX . SuperSocket . Server ;
1013using GameFrameX . SuperSocket . Server . Abstractions ;
1114using GameFrameX . SuperSocket . Server . Abstractions . Session ;
1215using GameFrameX . SuperSocket . Server . Host ;
@@ -194,18 +197,17 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
194197 if ( Setting . InnerPort > 0 && Net . PortIsAvailable ( Setting . InnerPort ) )
195198 {
196199 LogHelper . InfoConsole ( $ "启动 [TCP] 服务器 - 类型: { ServerType } , 地址: { Setting . InnerIp } , 端口: { Setting . InnerPort } ") ;
200+ hostBuilder . ConfigureServices ( ( context , collection ) => { collection . Configure < ServerOptions > ( ConfigureSuperSocket ) ; } ) ;
197201 hostBuilder . AddServer < IMessage , MessageObjectPipelineFilter > ( builder =>
198202 {
199- builder
200- . ConfigureSuperSocket ( ConfigureSuperSocket )
201- . UseClearIdleSession ( )
202- . UsePackageDecoder < TMessageDecoderHandler > ( )
203- . UsePackageEncoder < TMessageEncoderHandler > ( )
204- . UseSessionHandler ( OnConnected , OnDisconnected )
205- . UsePackageHandler ( PackageHandler , PackageErrorHandler )
206- . UseInProcSessionContainer ( ) ;
203+ builder . UseClearIdleSession ( )
204+ . UsePackageDecoder < TMessageDecoderHandler > ( )
205+ . UsePackageEncoder < TMessageEncoderHandler > ( )
206+ . UseSessionHandler ( OnConnected , OnDisconnected )
207+ . UsePackageHandler ( PackageHandler , PackageErrorHandler )
208+ . UseInProcSessionContainer ( ) ;
207209 } ) ;
208- LogHelper . InfoConsole ( $ "启动 [WebSocket ] 服务器启动完成 - 类型: { ServerType } , 地址: { Setting . InnerIp } , 端口: { Setting . InnerPort } ") ;
210+ LogHelper . InfoConsole ( $ "启动 [TCP ] 服务器启动完成 - 类型: { ServerType } , 地址: { Setting . InnerIp } , 端口: { Setting . InnerPort } ") ;
209211 }
210212 else
211213 {
@@ -220,12 +222,11 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
220222 // 配置并启动WebSocket服务器
221223 hostBuilder . AddWebSocketServer ( builder =>
222224 {
223- builder
224- . UseWebSocketMessageHandler ( WebSocketMessageHandler )
225- . UseSessionHandler ( OnConnected , OnDisconnected )
226- . ConfigureAppConfiguration ( ( Action < HostBuilderContext , IConfigurationBuilder > ) ConfigureWebServer ) ;
225+ builder . UseWebSocketMessageHandler ( WebSocketMessageHandler )
226+ . UseSessionHandler ( OnConnected , OnDisconnected ) ;
227+ // .ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)ConfigureWebServer);
227228 } ) ;
228-
229+ hostBuilder . ConfigureServices ( ( context , collection ) => { collection . Configure < ServerOptions > ( ConfigureWebServer ) ; } ) ;
229230 LogHelper . InfoConsole ( $ "启动 [WebSocket] 服务器启动完成 - 类型: { ServerType } , 端口: { Setting . WsPort } ") ;
230231 }
231232 else
@@ -236,9 +237,9 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
236237 if ( Setting . HttpPort is > 0 and < ushort . MaxValue && Net . PortIsAvailable ( Setting . HttpPort ) )
237238 {
238239 LogHelper . InfoConsole ( "启动 [HTTP] 服务器..." ) ;
239- var builder = hostBuilder . ConfigureWebHost ( m =>
240+ var builder = hostBuilder . ConfigureWebHost ( webHostBuilder =>
240241 {
241- m . UseKestrel ( options =>
242+ webHostBuilder . UseKestrel ( options =>
242243 {
243244 options . ListenAnyIP ( Setting . HttpPort ) ;
244245
@@ -266,94 +267,95 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
266267 Description = "GameFrameX HTTP API documentation" ,
267268 } ;
268269 var development = Setting . HttpIsDevelopment ;
269- builder . ConfigureServices ( services =>
270- {
271- if ( development )
272- {
273- // 开发模式,启用 Swagger
274- services . AddEndpointsApiExplorer ( ) ;
275- services . AddSwaggerGen ( options =>
270+ builder . ConfigureWebHostDefaults ( webHostBuilder =>
271+ {
272+ webHostBuilder . ConfigureServices ( ( context , services ) =>
273+ {
274+ services . Configure < ServerOptions > ( ConfigureHttp ) ;
275+ if ( development )
276+ {
277+ // 开发模式,启用 Swagger
278+ services . AddEndpointsApiExplorer ( ) ;
279+ services . AddSwaggerGen ( options =>
280+ {
281+ options . SwaggerDoc ( openApiInfo . Version , openApiInfo ) ;
282+
283+ // 使用自定义的 SchemaFilter 来保持属性名称大小写
284+ options . SchemaFilter < PreservePropertyCasingSchemaFilter > ( ) ;
285+
286+ // 添加自定义操作过滤器来处理动态路由
287+ options . OperationFilter < SwaggerOperationFilter > ( baseHandler ) ;
288+ // 使用完整的类型名称
289+ options . CustomSchemaIds ( type => type . Name ) ;
290+ } ) ;
291+ }
292+ } ) . Configure ( app =>
293+ {
294+ if ( development )
295+ {
296+ // 开发模式,启用 Swagger
297+ app . UseDeveloperExceptionPage ( ) ;
298+ app . UseSwagger ( )
299+ . UseSwaggerUI ( options =>
276300 {
277- options . SwaggerDoc ( openApiInfo . Version , openApiInfo ) ;
301+ options . SwaggerEndpoint ( $ "/swagger/{ openApiInfo . Version } /swagger.json", openApiInfo . Title ) ;
302+ options . RoutePrefix = "swagger" ;
303+ } ) ;
304+ }
278305
279- // 使用自定义的 SchemaFilter 来保持属性名称大小写
280- options . SchemaFilter < PreservePropertyCasingSchemaFilter > ( ) ;
306+ app . UseExceptionHandler ( ExceptionHandler ) ;
281307
282- // 添加自定义操作过滤器来处理动态路由
283- options . OperationFilter < SwaggerOperationFilter > ( baseHandler ) ;
284- // 使用完整的类型名称
285- options . CustomSchemaIds ( type => type . Name ) ;
286- } ) ;
287- }
288- } )
289- . ConfigureWebHostDefaults ( webHostBuilder =>
290- {
291- webHostBuilder . Configure ( app =>
292- {
293- if ( development )
294- {
295- // 开发模式,启用 Swagger
296- app . UseDeveloperExceptionPage ( ) ;
297- app . UseSwagger ( )
298- . UseSwaggerUI ( options =>
299- {
300- options . SwaggerEndpoint ( $ "/swagger/{ openApiInfo . Version } /swagger.json", openApiInfo . Title ) ;
301- options . RoutePrefix = "swagger" ;
302- } ) ;
303- }
304-
305- app . UseExceptionHandler ( ExceptionHandler ) ;
306-
307- var apiRootPath = Setting . HttpUrl ;
308- // 根路径必须以/开头和以/结尾
309- if ( ! Setting . HttpUrl . StartsWith ( '/' ) )
310- {
311- apiRootPath = "/" + Setting . HttpUrl ;
312- }
308+ var apiRootPath = Setting . HttpUrl ;
309+ // 根路径必须以/开头和以/结尾
310+ if ( ! Setting . HttpUrl . StartsWith ( '/' ) )
311+ {
312+ apiRootPath = "/" + Setting . HttpUrl ;
313+ }
313314
314- if ( ! Setting . HttpUrl . EndsWith ( '/' ) )
315- {
316- apiRootPath += "/" ;
317- }
315+ if ( ! Setting . HttpUrl . EndsWith ( '/' ) )
316+ {
317+ apiRootPath += "/" ;
318+ }
318319
319- GlobalSettings . ApiRootPath = apiRootPath ;
320- // 注册中间件
321- app . UseEndpoints ( configure =>
322- {
323- // 每个http处理器,注册到路由中
324- foreach ( var handler in baseHandler )
325- {
326- var handlerType = handler . GetType ( ) ;
327- var mappingAttribute = handlerType . GetCustomAttribute < HttpMessageMappingAttribute > ( ) ;
328- if ( mappingAttribute == null )
329- {
330- continue ;
331- }
332-
333- // 只支持POST请求
334- var route = configure . MapPost ( $ "{ apiRootPath } { mappingAttribute . StandardCmd } ", async ( HttpContext context , string text ) => { await HttpHandler . HandleRequest ( context , httpFactory , aopHandlerTypes ) ; } ) ;
335- if ( development )
336- {
337- // 开发模式,启用 Swagger
338- route . WithOpenApi ( operation =>
339- {
340- operation . Summary = "处理 POST 请求" ;
341- operation . Description = "处理来自游戏客户端的 POST 请求" ;
342- return operation ;
343- } ) ;
344- }
345- }
346- } ) ;
347- if ( development )
348- {
349- var ipList = Net . GetLocalIpList ( ) ;
350- foreach ( var ip in ipList )
351- {
352- LogHelper . DebugConsole ( $ "Swagger UI 可通过 http://{ ip } :{ Setting . HttpPort } /swagger 访问") ;
353- }
354- }
355- } ) ;
356- } ) ;
320+ GlobalSettings . ApiRootPath = apiRootPath ;
321+ // 注册中间件
322+ app . UseEndpoints ( configure =>
323+ {
324+ // 每个http处理器,注册到路由中
325+ foreach ( var handler in baseHandler )
326+ {
327+ var handlerType = handler . GetType ( ) ;
328+ var mappingAttribute = handlerType . GetCustomAttribute < HttpMessageMappingAttribute > ( ) ;
329+ if ( mappingAttribute == null )
330+ {
331+ continue ;
332+ }
333+
334+ // 只支持POST请求
335+ var route = configure . MapPost ( $ "{ apiRootPath } { mappingAttribute . StandardCmd } ", async ( HttpContext context , string text ) => { await HttpHandler . HandleRequest ( context , httpFactory , aopHandlerTypes ) ; } ) ;
336+ if ( development )
337+ {
338+ // 开发模式,启用 Swagger
339+ route . WithOpenApi ( operation =>
340+ {
341+ operation . Summary = "处理 POST 请求" ;
342+ operation . Description = "处理来自游戏客户端的 POST 请求" ;
343+ return operation ;
344+ } ) ;
345+ }
346+ }
347+ } ) ;
348+ if ( development )
349+ {
350+ var ipList = Net . GetLocalIpList ( ) ;
351+ foreach ( var ip in ipList )
352+ {
353+ LogHelper . DebugConsole ( $ "Swagger UI 可通过 http://{ ip } :{ Setting . HttpPort } /swagger 访问") ;
354+ }
355+ }
356+ } ) ;
357+ } ) ;
358+ LogHelper . InfoConsole ( $ "启动 [HTTP] 服务器启动完成 - 端口: { Setting . HttpPort } ") ;
357359 }
358360 else
359361 {
@@ -391,8 +393,6 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
391393 MessageEncoderHandler = messageEncoderHandler ;
392394
393395 await _gameServer . StartAsync ( ) ;
394-
395- LogHelper . InfoConsole ( $ "TCP服务器启动完成 - 类型: { ServerType } , 端口: { Setting . InnerPort } ") ;
396396 }
397397
398398 /// <summary>
@@ -418,15 +418,14 @@ private static void ExceptionHandler(IApplicationBuilder errorContext)
418418 /// <summary>
419419 /// 配置WebSocket服务器参数
420420 /// </summary>
421- private void ConfigureWebServer ( HostBuilderContext context , IConfigurationBuilder builder )
421+ private void ConfigureWebServer ( ServerOptions serverOptions )
422422 {
423- var paramsDict = new Dictionary < string , string >
423+ var listenOptions = new ListenOptions
424424 {
425- [ "serverOptions:listeners:0:port" ] = Setting . WsPort . ToString ( ) ,
426- [ "serverOptions:listeners:0:ip" ] = Setting . InnerIp . IsNullOrWhiteSpace ( ) ? "Any" : Setting . InnerIp ,
427- [ "serverOptions:name" ] = Setting . ServerName
425+ Ip = IPAddress . Any . ToString ( ) ,
426+ Port = Setting . WsPort ,
428427 } ;
429- builder . AddInMemoryCollection ( paramsDict ) ;
428+ serverOptions . AddListener ( listenOptions ) ;
430429 }
431430
432431 /// <summary>
0 commit comments