#if NETCORE
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.HttpSys;
namespace Apewer.Web
{
/// HTTP.sys 服务器。
///
/// HTTP.sys 是仅在 Windows 上运行的适用于 ASP.NET Core 的 Web 服务器,提供了一些 Kestrel 不提供的功能。
/// HTTP.sys 支持以下功能:
Windows 身份验证;
端口共享;
具有 SNI 的 HTTPS;
基于 TLS 的 HTTP/2(Windows 10 或更高版本);
直接文件传输;
响应缓存;
WebSocket(Windows 8 或更高版本)。
///
public class HttpSysServer : HttpSysServer where TStartup : AspNetCoreStartup
{
/// 启动。
public virtual void Run() => Run(false);
}
/// HTTP.sys 服务器。
///
/// HTTP.sys 是仅在 Windows 上运行的适用于 ASP.NET Core 的 Web 服务器,提供了一些 Kestrel 不提供的功能。
/// HTTP.sys 支持以下功能:
Windows 身份验证;
端口共享;
具有 SNI 的 HTTPS;
基于 TLS 的 HTTP/2(Windows 10 或更高版本);
直接文件传输;
响应缓存;
WebSocket(Windows 8 或更高版本)。
///
public class HttpSysServer : AspNetCoreServer
{
/// 配置 WebHost 构建程序。
protected override void Configure(IWebHostBuilder builder) => builder.UseHttpSys(Configure);
/// 配置 HTTP.sys 服务器。
protected virtual void Configure(HttpSysOptions options)
{
// 同步 IO。
options.AllowSynchronousIO = true;
// 限制请求大小。
options.MaxRequestBodySize = MaxBody;
// 禁用内核缓存。
options.EnableResponseCaching = false;
// 认证。
options.Authentication.Schemes = Microsoft.AspNetCore.Server.HttpSys.AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
// 配置端口和证书。
var ip = "0.0.0.0";
var port = Port;
var certificate = Certificate;
var protocol = certificate == null ? "http" : "https";
var prefix = $"{protocol}://{ip}:{port}";
options.UrlPrefixes.Add(prefix);
}
/// 启动。
public override void Run() => Run(false);
}
}
#endif