/// <summary> /// Start accepting incoming requests. /// </summary> public void Start() { CheckDisposed(); Log.ListenerStarting(Logger); // Make sure there are no race conditions between Start/Stop/Abort/Close/Dispose. // Start needs to setup all resources. Abort/Stop must not interfere while Start is // allocating those resources. lock (_internalLock) { try { CheckDisposed(); if (_state == State.Started) { return; } // If this instance created the queue then configure it. if (_requestQueue.Created) { Options.Apply(UrlGroup, RequestQueue); _requestQueue.AttachToUrlGroup(); // All resources are set up correctly. Now add all prefixes. try { Options.UrlPrefixes.RegisterAllPrefixes(UrlGroup); } catch (HttpSysException) { // If an error occurred while adding prefixes, free all resources allocated by previous steps. _requestQueue.DetachFromUrlGroup(); throw; } } _state = State.Started; } catch (Exception exception) { // Make sure the HttpListener instance can't be used if Start() failed. _state = State.Disposed; DisposeInternal(); Log.ListenerStartError(Logger, exception); throw; } } }