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
149 lines
4.5 KiB
#if NETCORE
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
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 System.Net;
|
|
using System.Net.WebSockets;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.Net.Security;
|
|
using System.Security.Authentication;
|
|
using Microsoft.Extensions.Logging.Console;
|
|
|
|
namespace Apewer.Web
|
|
{
|
|
|
|
/// <summary>ASP.NET Core 服务器。</summary>
|
|
public abstract class AspNetCoreServer : IDisposable
|
|
{
|
|
|
|
#region 通用。
|
|
|
|
IHost _host;
|
|
IHostBuilder _builder;
|
|
|
|
private bool _running = false;
|
|
|
|
/// <summary>正在运行。</summary>
|
|
public bool Running { get => _running; }
|
|
|
|
/// <summary>启动 Host。</summary>
|
|
protected Exception Run<TStartup>(bool async) where TStartup : AspNetCoreStartup
|
|
{
|
|
try
|
|
{
|
|
_builder = Host.CreateDefaultBuilder();
|
|
|
|
if (!LogConsole)
|
|
{
|
|
_builder.ConfigureLogging((context, builder) =>
|
|
{
|
|
if (context.HostingEnvironment.IsProduction())
|
|
{
|
|
foreach (var sd in builder.Services)
|
|
{
|
|
if (sd.ImplementationType.Equals(typeof(ConsoleLoggerProvider)))
|
|
{
|
|
builder.Services.Remove(sd);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
_builder.ConfigureWebHostDefaults((builder) =>
|
|
{
|
|
Configure(builder);
|
|
builder.UseIIS();
|
|
builder.UseStartup<TStartup>();
|
|
});
|
|
|
|
// 运行。
|
|
_host = _builder.Build();
|
|
if (async) _host.RunAsync();
|
|
else _host.Run();
|
|
|
|
return null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return ex;
|
|
}
|
|
}
|
|
|
|
/// <summary>配置 WebHost 构建程序。</summary>
|
|
protected abstract void Configure(IWebHostBuilder builder);
|
|
|
|
/// <summary>启动。</summary>
|
|
public abstract void Run<T>() where T : AspNetCoreStartup;
|
|
|
|
/// <summary>释放非托管资源。</summary>
|
|
public void Dispose()
|
|
{
|
|
RuntimeUtility.Dispose(_host);
|
|
_host = null;
|
|
_running = false;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 用于派生类的属性。
|
|
|
|
private int _port = -1;
|
|
private bool _compression = false;
|
|
private long _maxbody = 1073741824L;
|
|
private X509Certificate2 _certificate = null;
|
|
private SslProtocols _ssl = SslProtocols.Tls;
|
|
|
|
/// <summary>监听的端口。默认值:自动选择 80 端口或 443 端口。</summary>
|
|
public int Port
|
|
{
|
|
get { return (_port < 0) ? (_certificate == null ? 80 : 443) : _port; }
|
|
set { if (!_running) _port = value.Restrict(0, 65535); }
|
|
}
|
|
|
|
/// <summary>使用的证书。默认值:无。</summary>
|
|
public X509Certificate2 Certificate
|
|
{
|
|
get { return _certificate; }
|
|
set { if (!_running) _certificate = value; }
|
|
}
|
|
|
|
/// <summary>请求的最大 Body 大小,单位为字节,最小为 1 MB。默认值:1073741824(1 GB)。</summary>
|
|
public long MaxBody
|
|
{
|
|
get { return _maxbody; }
|
|
set { if (!_running) _maxbody = value.Restrict(1048576L, 1073741824L); }
|
|
}
|
|
|
|
/// <summary>使用 SSL 时的协议。默认值:TLS 1.0。</summary>
|
|
public SslProtocols SslProtocol
|
|
{
|
|
get { return _ssl; }
|
|
set { if (!_running) _ssl = value; }
|
|
}
|
|
|
|
/// <summary>尝试启用压缩。默认值:不启用。</summary>
|
|
public bool Compression
|
|
{
|
|
get { return _compression; }
|
|
set { if (!_running) _compression = value; }
|
|
}
|
|
|
|
/// <summary>使用默认的控制台日志。</summary>
|
|
/// <remarks>默认值:TRUE</remarks>
|
|
public bool LogConsole { get; set; } = true;
|
|
|
|
#endregion
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|