using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; namespace WindowsServiceClient { public delegate void RequestReceivedEventHandler(HttpListenerContext context); public class HttpWebServer : IDisposable { protected HttpListener _listener; protected bool _isListenerOn; public event RequestReceivedEventHandler OnRequestReceived; public HttpWebServer(HttpWebServerResponsor responsor) { OnRequestReceived += responsor.Response; } public void StartListening(string[] urlCollection) { _isListenerOn = true; _listener = new HttpListener(); foreach (var i in urlCollection) _listener.Prefixes.Add(i); _listener.Start(); Action requestLoop = new Action(delegate { while (_isListenerOn) { _listener.BeginGetContext(new AsyncCallback(delegate (IAsyncResult ar) { OnRequestReceived(_listener.EndGetContext(ar)); }), null).AsyncWaitHandle.WaitOne(); } }); requestLoop.BeginInvoke(null, null); } public void StopListening() { if (_isListenerOn) { _isListenerOn = false; if (_listener != null) { _listener.Stop(); _listener.Close(); _listener = null; } } } public void Dispose() { StopListening(); } } public class HttpWebServerResponsor { public RequestReceivedEventHandler errorResponseMethod; private ServerCommandNode _rootNode; public ServerCommandNode RootNode { get => _rootNode; } public HttpWebServerResponsor() { _rootNode = new ServerCommandNode(""); } public void Response(HttpListenerContext context) { string[] urlGroup = context.Request.RawUrl.Split('?')[0].Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); ServerCommandNode node = _rootNode; RequestReceivedEventHandler responseMethod = null; foreach (var i in urlGroup) { node = node[i]; if (node == null) { responseMethod = errorResponseMethod; break; } } if (node != null) responseMethod = node.RootResponseMethod; responseMethod?.Invoke(context); return; } } public class ServerCommandNode { string _name; Dictionary _serverNodes; public RequestReceivedEventHandler RootResponseMethod; public ServerCommandNode this[string nodeName] { get => _serverNodes[nodeName]; } public void AddNode(string name, RequestReceivedEventHandler requestReceived = null) { _serverNodes.Add(name, new ServerCommandNode(name, requestReceived)); } public ServerCommandNode(string name, RequestReceivedEventHandler requestReceived = null) { _name = name; _serverNodes = new Dictionary(); RootResponseMethod = requestReceived; } } }