/// <summary> /// Stop listening /// </summary> public async Task StopAsync() { // Log it CoreLogger.Log($"LiveServer '{ServingDirectory}' stopping...", type: LogType.Warning); // Lock call await AsyncAwaitor.AwaitAsync(mStopLock, async() => { try { // Stop listener mListener.Stop(); } catch (Exception ex) { // Log it Debugger.Break(); CoreLogger.Log($"Failed to stop LiveServer listener. {ex.Message}", type: LogType.Warning); } // Set stopping flag to true Stopping = true; // Dispose folder watcher mFolderWatcher?.Dispose(); mFolderWatcher = null; // Set it so any blocked calls pass on mContentChangedResetEvent.Set(); mContentChangedResetEvent.Reset(); // Flag that we are no longer listening while (Listening) { await Task.Delay(100); } // Log it CoreLogger.Log($"LiveServer {ServingDirectory} stopped", type: LogType.Attention); }); }
/// <summary> /// Starts listening on the specified <see cref="Port"/> /// </summary> /// <returns>Returns the URL that is being listened on</returns> public string Listen() { lock (mListenLock) { // If we are already listening... if (Listening) { // Ignore return(null); } #region Get Port try { // Get port if one is not specified if (Port <= 0) { // Log it CoreLogger.Log("LiveServer getting available port..."); // Get next available port Port = NextAvailablePort(); } } catch (Exception ex) { // Log it Debugger.Break(); CoreLogger.Log($"LiveServer failed to find an available port. {ex.Message}", type: LogType.Error); // Go no further return(null); } // Log port to be used CoreLogger.Log($"LiveServer will listen on port {Port}"); #endregion // Expected listen URL var listenUrl = $"http://localhost:{Port}/"; #region Listen try { // Create new Http Listener mListener = new HttpListener(); // Set port number mListener.Prefixes.Add(listenUrl); // Start listening mListener.Start(); // Run new thread listening for content // until we call Stop or Dispose SafeTask.Run(() => ListenForContent()); // Set Listening flag Listening = true; // Log it CoreLogger.Log($"LiveServer listening on http://localhost:{Port}, directory '{ServingDirectory}'", type: LogType.Information); } catch (Exception ex) { // Log it Debugger.Break(); CoreLogger.Log($"LiveServer failed to start on port {Port}, directory '{ServingDirectory}'. {ex.Message}", type: LogType.Error); // Go no further return(null); } #endregion #region File Change Watcher mFolderWatcher = new FolderWatcher { Filter = "*", Path = ServingDirectory, UpdateDelay = 100 }; // Listen for file changes mFolderWatcher.FileChanged += FolderWatcher_FileChanged; mFolderWatcher.Start(); #endregion // Return URL we are now listening on return(listenUrl); } }