#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