Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

100 rindas
4.7 KiB

  1. using DotNetty.Buffers;
  2. using DotNetty.Codecs;
  3. using DotNetty.Codecs.Http;
  4. using DotNetty.Codecs.Http.Cors;
  5. using DotNetty.Common.Utilities;
  6. using DotNetty.Handlers.Streams;
  7. using DotNetty.Handlers.Timeout;
  8. using DotNetty.Transport.Bootstrapping;
  9. using DotNetty.Transport.Channels;
  10. using DotNetty.Transport.Libuv;
  11. using JT1078.DotNetty.Core.Codecs;
  12. using JT1078.DotNetty.Core.Configurations;
  13. using JT1078.DotNetty.Http.Handlers;
  14. using JT1078.Protocol;
  15. using Microsoft.Extensions.DependencyInjection;
  16. using Microsoft.Extensions.Hosting;
  17. using Microsoft.Extensions.Logging;
  18. using Microsoft.Extensions.Options;
  19. using System;
  20. using System.Net;
  21. using System.Runtime.InteropServices;
  22. using System.Threading;
  23. using System.Threading.Tasks;
  24. namespace JT1078.DotNetty.Http
  25. {
  26. /// <summary>
  27. /// JT1078 http服务
  28. /// </summary>
  29. internal class JT1078HttpServerHost : IHostedService
  30. {
  31. private readonly JT1078Configuration configuration;
  32. private readonly ILogger<JT1078HttpServerHost> logger;
  33. private DispatcherEventLoopGroup bossGroup;
  34. private WorkerEventLoopGroup workerGroup;
  35. private IChannel bootstrapChannel;
  36. private IByteBufferAllocator serverBufferAllocator;
  37. private readonly IServiceProvider serviceProvider;
  38. public JT1078HttpServerHost(
  39. IServiceProvider serviceProvider,
  40. ILoggerFactory loggerFactory,
  41. IOptions<JT1078Configuration> configurationAccessor)
  42. {
  43. this.serviceProvider = serviceProvider;
  44. configuration = configurationAccessor.Value;
  45. logger=loggerFactory.CreateLogger<JT1078HttpServerHost>();
  46. }
  47. public Task StartAsync(CancellationToken cancellationToken)
  48. {
  49. bossGroup = new DispatcherEventLoopGroup();
  50. workerGroup = new WorkerEventLoopGroup(bossGroup, configuration.EventLoopCount);
  51. serverBufferAllocator = new PooledByteBufferAllocator();
  52. ServerBootstrap bootstrap = new ServerBootstrap();
  53. bootstrap.Group(bossGroup, workerGroup);
  54. bootstrap.Channel<TcpServerChannel>();
  55. if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
  56. || RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
  57. {
  58. bootstrap
  59. .Option(ChannelOption.SoReuseport, true)
  60. .ChildOption(ChannelOption.SoReuseaddr, true);
  61. }
  62. bootstrap
  63. .Option(ChannelOption.SoBacklog, 8192)
  64. .ChildOption(ChannelOption.Allocator, serverBufferAllocator)
  65. .ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
  66. {
  67. IChannelPipeline pipeline = channel.Pipeline;
  68. pipeline.AddLast(new HttpServerCodec());
  69. pipeline.AddLast(new CorsHandler(CorsConfigBuilder
  70. .ForAnyOrigin()
  71. .AllowNullOrigin()
  72. .AllowedRequestMethods(HttpMethod.Get, HttpMethod.Post, HttpMethod.Options, HttpMethod.Delete)
  73. .AllowedRequestHeaders((AsciiString)"origin", (AsciiString)"range", (AsciiString)"accept-encoding", (AsciiString)"referer", (AsciiString)"Cache-Control", (AsciiString)"X-Proxy-Authorization", (AsciiString)"X-Requested-With", (AsciiString)"Content-Type")
  74. .ExposeHeaders((StringCharSequence)"Server", (StringCharSequence)"range", (StringCharSequence)"Content-Length", (StringCharSequence)"Content-Range")
  75. .AllowCredentials()
  76. .Build()));
  77. pipeline.AddLast(new HttpObjectAggregator(int.MaxValue));
  78. using (var scope = serviceProvider.CreateScope())
  79. {
  80. pipeline.AddLast("JT1078HttpServerHandler", scope.ServiceProvider.GetRequiredService<JT1078HttpServerHandler>());
  81. }
  82. }));
  83. logger.LogInformation($"JT1078 Http Server start at {IPAddress.Any}:{configuration.HttpPort}.");
  84. return bootstrap.BindAsync(configuration.HttpPort)
  85. .ContinueWith(i => bootstrapChannel = i.Result);
  86. }
  87. public async Task StopAsync(CancellationToken cancellationToken)
  88. {
  89. await bootstrapChannel.CloseAsync();
  90. var quietPeriod = configuration.QuietPeriodTimeSpan;
  91. var shutdownTimeout = configuration.ShutdownTimeoutTimeSpan;
  92. await workerGroup.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout);
  93. await bossGroup.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout);
  94. }
  95. }
  96. }