public static void ConfigureEndpoints(this KestrelServerOptions options) { var configuration = options.ApplicationServices.GetRequiredService <IConfiguration>(); var endpoints = configuration.GetSection("HttpServer:Endpoints") .GetChildren() .ToDictionary(section => section.Key, section => { var endpoint = new EndpointConfigurationSettings(); section.Bind(endpoint); return(endpoint); }); foreach (var endpoint in endpoints) { CreateEndPoint(options, endpoint.Value); } }
private static void CreateEndPoint(KestrelServerOptions options, EndpointConfigurationSettings endpoint) { var environment = options.ApplicationServices.GetRequiredService <IHostEnvironment>(); var port = endpoint.Port ?? (endpoint.Scheme == "https" ? 443 : 80); var ipAddresses = new List <IPAddress>(); if (endpoint.Host == "localhost") { Log.Logger.Information("Binding to localhost:{port}.", port); ipAddresses.Add(IPAddress.Loopback); } else if (IPAddress.TryParse(endpoint.Host, out var address)) { Log.Logger.Information("Binding to {ipAddress}:{port}.", address.ToString(), port); ipAddresses.Add(address); } else { Log.Logger.Information("Binding to IPAddress.Any:{port}", port); ipAddresses.Add(IPAddress.Any); } foreach (var address in ipAddresses) { options.Listen(address, port, listenOptions => { listenOptions.Protocols = GetHttpVersion(endpoint); if (endpoint.Scheme != "https") { return; } var certificate = LoadCertificate(endpoint, environment); listenOptions.UseHttps(certificate); }); } }
private static HttpProtocols GetHttpVersion(EndpointConfigurationSettings options) { return(options.Version switch { 2 => HttpProtocols.Http2, _ => HttpProtocols.Http1 });