/// <summary> /// Starts the HTTP listener. /// </summary> private void StartHttpListener() { try { //create http listener _logger.WriteMessage("Service", $"Creating HTTP listener.."); _httpListener = new SimpleHttpListener(_config.ListenPort, _errorHandler); //add statistics handler _logger.WriteMessage("Service", $"Registering 'Statistics' HTTP handler.."); StatisticsHandler statisticsHandler = new StatisticsHandler(_errorHandler, _config, _logger, _serviceStats, _statsWriters); _httpListener.RegisterHandler("statistics", statisticsHandler); //add config handler _logger.WriteMessage("Service", $"Registering 'Config' HTTP handler.."); ConfigHandler configHandler = new ConfigHandler(_errorHandler, _config, _logger, _serviceStats); _httpListener.RegisterHandler("config", configHandler); //add gpio handler _logger.WriteMessage("Service", $"Registering 'GPIO' HTTP handler.."); GpioHandler gpioHandler = new GpioHandler(_errorHandler, _config, _logger, _serviceStats, _gpio); _httpListener.RegisterHandler("gpio", gpioHandler); //pre-init _logger.WriteMessage("Service", $"Running pre-init handler functions.."); foreach (IHttpHandler handler in _httpListener.GetHandlers()) { handler.PreInitialize(); } //start http listener _logger.WriteMessage("Service", $"Starting HTTP listener on port {_config.ListenPort}.."); _httpListener.Start(); //pre-init _logger.WriteMessage("Service", $"Running post-init handler functions.."); foreach (IHttpHandler handler in _httpListener.GetHandlers()) { handler.PostInitialize(); } //success _logger.WriteMessage("Service", $"HTTP listener successfully connected"); //state _serviceState.SetState(ServiceStateType.Up); } catch (Exception ex) { _errorHandler?.LogError(ex); } }
public async Task RunAsync() { _listener.Start(); while (!_stopRequired) { try { MyHttpListenerContext context = await _listener.GetContextAsync().ConfigureAwait(false); if (context == null) { return; // Слушатель был остановлен. } if (context.Request.Method == "GET" && context.Request.Uri.LocalPath.StartsWith("/.well-known/acme-challenge/")) { Log.Information($"Принят HTTP запрос: {context.Request.Uri.Scheme}://{context.Request.Uri.Host}/..."); MyHttpListenerResponse response = context.Response; response.ContentType = "plain/text"; byte[] content = Encoding.ASCII.GetBytes(_keyAuthString); response.ContentLength64 = content.Length; using (response.OutputStream) { await response.OutputStream.WriteAsync(content, 0, content.Length).ConfigureAwait(false); await response.OutputStream.CloseAsync().ConfigureAwait(false); } _tcs.TrySetResult(0); Log.Information($"Отправлен ключ подтверждения."); } } catch (HttpListenerClosedException) { // Грациозная остановка. break; } catch when(_stopRequired) { // Грязная остановка. break; } } }