public Task StartAsync <TContext>(IHttpApplication <TContext> application, CancellationToken cancellationToken) where TContext : notnull { if (application == null) { throw new ArgumentNullException(nameof(application)); } var hostingUrlsPresent = _serverAddresses.Addresses.Count > 0; var serverAddressCopy = _serverAddresses.Addresses.ToList(); _serverAddresses.Addresses.Clear(); if (_serverAddresses.PreferHostingUrls && hostingUrlsPresent) { if (_options.UrlPrefixes.Count > 0) { Log.ClearedPrefixes(_logger, _serverAddresses.Addresses); Listener.Options.UrlPrefixes.Clear(); } UpdateUrlPrefixes(serverAddressCopy); } else if (_options.UrlPrefixes.Count > 0) { if (hostingUrlsPresent) { Log.ClearedAddresses(_logger, _serverAddresses.Addresses); _serverAddresses.Addresses.Clear(); } } else if (hostingUrlsPresent) { UpdateUrlPrefixes(serverAddressCopy); } else if (Listener.RequestQueue.Created) { Log.BindingToDefault(_logger); Listener.Options.UrlPrefixes.Add(Constants.DefaultServerAddress); } // else // Attaching to an existing queue, don't add a default. // Can't start twice Debug.Assert(RequestContextFactory == null, "Start called twice!"); Debug.Assert(application != null); RequestContextFactory = new ApplicationRequestContextFactory <TContext>(application, this); Listener.Start(); // Update server addresses after we start listening as port 0 // needs to be selected at the point of binding. foreach (var prefix in _options.UrlPrefixes) { _serverAddresses.Addresses.Add(prefix.FullPrefix); } // Dispatch to get off the SynchronizationContext and use UnsafeQueueUserWorkItem to avoid capturing the ExecutionContext ThreadPool.UnsafeQueueUserWorkItem(state => state.ActivateRequestProcessingLimits(), this, preferLocal: false); return(Task.CompletedTask); }
public Task StartAsync <TContext>(IHttpApplication <TContext> application, CancellationToken cancellationToken) { if (application == null) { throw new ArgumentNullException(nameof(application)); } var hostingUrlsPresent = _serverAddresses.Addresses.Count > 0; var serverAddressCopy = _serverAddresses.Addresses.ToList(); _serverAddresses.Addresses.Clear(); if (_serverAddresses.PreferHostingUrls && hostingUrlsPresent) { if (_options.UrlPrefixes.Count > 0) { _logger.LogWarning(LoggerEventIds.ClearedPrefixes, $"Overriding endpoints added to {nameof(HttpSysOptions.UrlPrefixes)} since {nameof(IServerAddressesFeature.PreferHostingUrls)} is set to true." + $" Binding to address(es) '{string.Join(", ", _serverAddresses.Addresses)}' instead. "); Listener.Options.UrlPrefixes.Clear(); } UpdateUrlPrefixes(serverAddressCopy); } else if (_options.UrlPrefixes.Count > 0) { if (hostingUrlsPresent) { _logger.LogWarning(LoggerEventIds.ClearedAddresses, $"Overriding address(es) '{string.Join(", ", _serverAddresses.Addresses)}'. " + $"Binding to endpoints added to {nameof(HttpSysOptions.UrlPrefixes)} instead."); _serverAddresses.Addresses.Clear(); } } else if (hostingUrlsPresent) { UpdateUrlPrefixes(serverAddressCopy); } else if (Listener.RequestQueue.Created) { _logger.LogDebug(LoggerEventIds.BindingToDefault, $"No listening endpoints were configured. Binding to {Constants.DefaultServerAddress} by default."); Listener.Options.UrlPrefixes.Add(Constants.DefaultServerAddress); } // else // Attaching to an existing queue, don't add a default. // Can't start twice Debug.Assert(RequestContextFactory == null, "Start called twice!"); Debug.Assert(application != null); RequestContextFactory = new ApplicationRequestContextFactory <TContext>(application, this); Listener.Start(); // Update server addresses after we start listening as port 0 // needs to be selected at the point of binding. foreach (var prefix in _options.UrlPrefixes) { _serverAddresses.Addresses.Add(prefix.FullPrefix); } // Dispatch to get off the SynchronizationContext and use UnsafeQueueUserWorkItem to avoid capturing the ExecutionContext ThreadPool.UnsafeQueueUserWorkItem(state => state.ActivateRequestProcessingLimits(), this, preferLocal: false); return(Task.CompletedTask); }