| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
-
- 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<string, ServerCommandNode> _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<string, ServerCommandNode>();
- RootResponseMethod = requestReceived;
- }
- }
- }
|