You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
4.5 KiB

4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
  1. #if NETCORE
  2. using System;
  3. using System.Collections.Generic;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Hosting;
  6. using Microsoft.Extensions.Hosting;
  7. using Microsoft.Extensions.Configuration;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using Microsoft.AspNetCore.Builder;
  10. using System.Threading.Tasks;
  11. using System.Net;
  12. using System.Net.WebSockets;
  13. using System.Security.Cryptography.X509Certificates;
  14. using System.Net.Security;
  15. using System.Security.Authentication;
  16. using Microsoft.Extensions.Logging.Console;
  17. namespace Apewer.Web
  18. {
  19. /// <summary>ASP.NET Core 服务器。</summary>
  20. public abstract class AspNetCoreServer : IDisposable
  21. {
  22. #region 通用。
  23. IHost _host;
  24. IHostBuilder _builder;
  25. private bool _running = false;
  26. /// <summary>正在运行。</summary>
  27. public bool Running { get => _running; }
  28. /// <summary>启动 Host。</summary>
  29. protected Exception Run<TStartup>(bool async) where TStartup : AspNetCoreStartup
  30. {
  31. try
  32. {
  33. _builder = Host.CreateDefaultBuilder();
  34. if (!LogConsole)
  35. {
  36. _builder.ConfigureLogging((context, builder) =>
  37. {
  38. if (context.HostingEnvironment.IsProduction())
  39. {
  40. foreach (var sd in builder.Services)
  41. {
  42. if (sd.ImplementationType.Equals(typeof(ConsoleLoggerProvider)))
  43. {
  44. builder.Services.Remove(sd);
  45. break;
  46. }
  47. }
  48. }
  49. });
  50. }
  51. _builder.ConfigureWebHostDefaults((builder) =>
  52. {
  53. Configure(builder);
  54. builder.UseIIS();
  55. builder.UseStartup<TStartup>();
  56. });
  57. // 运行。
  58. _host = _builder.Build();
  59. if (async) _host.RunAsync();
  60. else _host.Run();
  61. return null;
  62. }
  63. catch (Exception ex)
  64. {
  65. return ex;
  66. }
  67. }
  68. /// <summary>配置 WebHost 构建程序。</summary>
  69. protected abstract void Configure(IWebHostBuilder builder);
  70. /// <summary>启动。</summary>
  71. public abstract void Run<T>() where T : AspNetCoreStartup;
  72. /// <summary>释放非托管资源。</summary>
  73. public void Dispose()
  74. {
  75. RuntimeUtility.Dispose(_host);
  76. _host = null;
  77. _running = false;
  78. }
  79. #endregion
  80. #region 用于派生类的属性。
  81. private int _port = -1;
  82. private bool _compression = false;
  83. private long _maxbody = 1073741824L;
  84. private X509Certificate2 _certificate = null;
  85. private SslProtocols _ssl = SslProtocols.Tls;
  86. /// <summary>监听的端口。默认值:自动选择 80 端口或 443 端口。</summary>
  87. public int Port
  88. {
  89. get { return (_port < 0) ? (_certificate == null ? 80 : 443) : _port; }
  90. set { if (!_running) _port = value.Restrict(0, 65535); }
  91. }
  92. /// <summary>使用的证书。默认值:无。</summary>
  93. public X509Certificate2 Certificate
  94. {
  95. get { return _certificate; }
  96. set { if (!_running) _certificate = value; }
  97. }
  98. /// <summary>请求的最大 Body 大小,单位为字节,最小为 1 MB。默认值:1073741824(1 GB)。</summary>
  99. public long MaxBody
  100. {
  101. get { return _maxbody; }
  102. set { if (!_running) _maxbody = value.Restrict(1048576L, 1073741824L); }
  103. }
  104. /// <summary>使用 SSL 时的协议。默认值:TLS 1.0。</summary>
  105. public SslProtocols SslProtocol
  106. {
  107. get { return _ssl; }
  108. set { if (!_running) _ssl = value; }
  109. }
  110. /// <summary>尝试启用压缩。默认值:不启用。</summary>
  111. public bool Compression
  112. {
  113. get { return _compression; }
  114. set { if (!_running) _compression = value; }
  115. }
  116. /// <summary>使用默认的控制台日志。</summary>
  117. /// <remarks>默认值:TRUE</remarks>
  118. public bool LogConsole { get; set; } = true;
  119. #endregion
  120. }
  121. }
  122. #endif