#if NETCORE using System; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Builder; using System.Threading.Tasks; using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.AspNetCore.ResponseCompression; namespace Apewer.Web { /// public abstract class AspNetCoreStartup { /// 处理 WebSocket 请求。 /// 默认值:FALSE。 public virtual bool UseWebSocket { get; protected set; } = false; /// WebSocket 保持活动的间隔时间,单位为秒。 /// 默认值:10。 public virtual int KeepAlive { get; } = 10; /// 处理请求。 /// public abstract void OnContext(HttpContext context); /// 使用压缩。 public virtual bool UseCompression { get => false; } /// 处理 WebSocket 请求。 public virtual void OnWebSocket(HttpContext context, System.Net.WebSockets.WebSocket webSocket) { } /// 限制请求体的字节数,默认值:1073741824(1GB)。 public virtual long MaxRequestBodySize { get => 1073741824L; } #region Runtime bool _usedWebSocket = false; IConfiguration _configuration; /// public AspNetCoreStartup() { } /// public AspNetCoreStartup(IConfiguration configuration) => _configuration = configuration; /// 使用此方法添加服务到容器。 /// 此方法由运行时调用。 public void ConfigureServices(IServiceCollection services) { var maxRequestBodySize = MaxRequestBodySize; if (maxRequestBodySize < 1L) maxRequestBodySize = 1073741824L; services.Configure(options => { // 同步 IO。 options.AllowSynchronousIO = true; // 限制请求大小。 options.Limits.MaxRequestBodySize = maxRequestBodySize; // 在 Response 中不包含 Server 属性。 options.AddServerHeader = false; }); services.Configure(options => { // 同步 IO。 options.AllowSynchronousIO = true; // 限制请求大小。 options.MaxRequestBodySize = maxRequestBodySize; }); if (UseCompression) { services.AddResponseCompression(options => { options.EnableForHttps = true; options.Providers.Add(); options.Providers.Add(); }); } services.AddControllers(); services.AddSingleton(); } /// 此方法由运行时调用。 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); _usedWebSocket = UseWebSocket; if (_usedWebSocket) { var wsOptions = new WebSocketOptions(); var keepAlive = KeepAlive; if (keepAlive > 0) wsOptions.KeepAliveInterval = TimeSpan.FromSeconds(keepAlive); app.UseWebSockets(wsOptions); } app.Run(Handler); } Task Handler(HttpContext context) { try { if (_usedWebSocket && UseWebSocket) { if (context.WebSockets.IsWebSocketRequest) { using (var ws = context.WebSockets.AcceptWebSocketAsync()) { OnWebSocket(context, ws.Result); } return Task.CompletedTask; } } OnContext(context); } catch { } return Task.CompletedTask; } #endregion } } #endif