internal override async Task BindAsync(ReplicaAddressBindContext context) { var exceptions = new List <Exception>(); try { var v4Options = Clone(IPAddress.Loopback); await ReplicaAddressBinder.BindEndpointAsync(v4Options, context).ConfigureAwait(false); } catch (Exception ex) when(!(ex is IOException)) { context.Logger.LogWarning(0, ReplicaCoreStrings.NetworkInterfaceBindingFailed, GetDisplayName(), "IPv4 loopback", ex.Message); exceptions.Add(ex); } try { var v6Options = Clone(IPAddress.IPv6Loopback); await ReplicaAddressBinder.BindEndpointAsync(v6Options, context).ConfigureAwait(false); } catch (Exception ex) when(!(ex is IOException)) { context.Logger.LogWarning(0, ReplicaCoreStrings.NetworkInterfaceBindingFailed, GetDisplayName(), "IPv6 loopback", ex.Message); exceptions.Add(ex); } if (exceptions.Count == 2) { throw new IOException(ReplicaCoreStrings.FormatAddressBindingFailed(GetDisplayName()), new AggregateException(exceptions)); } // If StartLocalhost doesn't throw, there is at least one listener. // The port cannot change for "localhost". context.Addresses.Add(GetDisplayName()); }
public void Load() { if (_loaded) { // The loader has already been run. return; } _loaded = true; LoadDefaultCert(ConfigurationReader); foreach (var endpoint in ConfigurationReader.Endpoints) { var listenOptions = ReplicaAddressBinder.ParseAddress(endpoint.Url, out var https); //ZX //Options.ApplyEndpointDefaults(listenOptions); if (endpoint.Protocols.HasValue) { listenOptions.Protocols = endpoint.Protocols.Value; } // Compare to UseHttps(httpsOptions => { }) var httpsOptions = new ReplicaHttpsConnectionAdapterOptions(); if (https) { // Defaults //ZX //Options.ApplyHttpsDefaults(httpsOptions); // Specified httpsOptions.ServerCertificate = LoadCertificate(endpoint.Certificate, endpoint.Name) ?? httpsOptions.ServerCertificate; // Fallback //ZX //Options.ApplyDefaultCert(httpsOptions); } if (EndpointConfigurations.TryGetValue(endpoint.Name, out var configureEndpoint)) { var endpointConfig = new ReplicaEndpointConfiguration(https, listenOptions, httpsOptions, endpoint.ConfigSection); configureEndpoint(endpointConfig); } // EndpointDefaults or configureEndpoint may have added an https adapter. if (https && !listenOptions.ConnectionAdapters.Any(f => f.IsHttps)) { if (httpsOptions.ServerCertificate == null && httpsOptions.ServerCertificateSelector == null) { throw new InvalidOperationException(ReplicaCoreStrings.NoCertSpecifiedNoDevelopmentCertificateFound); } listenOptions.UseHttps(httpsOptions); } // ZX: //Options.ListenOptions.Add(listenOptions); } foreach (var action in EndpointsToAdd) { action(); } }