Пример #1
0
        /// <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);
            });
        }
Пример #2
0
        /// <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);
            }
        }