.NET: рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдФрд░ рд╕рд░реНрд╡рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдирд╛

рдирдорд╕реНрдХрд╛рд░, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░, рд╕рдВрднрд╡рддрдГ, рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

рдХрд╛рд░реНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд▓рдЧ-рдЗрди рдХреЛ рд╕рд░реНрд╡рд░ (рдкреНрд░рджрд░реНрд╢рди, рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЪрдпрди), рдпрд╛ рдХреБрдЫ рдмрджрд▓рд╛рд╡ (рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ, рдЖрджрд┐) рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЛ рдЯреАрд╕реАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░рд┐рдгрд╛рдо HTML рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рднрд┐рдиреНрди рд╢рд╣рд░реЛрдВ рдореЗрдВ рдХрдИ рд╕рд░реНрд╡рд░ рд╣реИрдВ, рдХрдиреЗрдХреНрд╢рди рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ, рд╕рд░реНрд╡рд░ рдмрд╣реБрдд рдЙрддреНрдкрд╛рджрдХ рдирд╣реАрдВ рд╣реИрдВ, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рджрд┐рди рдореЗрдВ 10 рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХреБрд▓ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рддрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛:




рд╡рд┐рдХрд╛рд╕ IPlugin рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ:


namespace Interface { public interface IPlugin { string Name { get; } string Version { get; } string Author { get; } object Data(Dictionary<string, string> query); } } 


рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ () рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╕реЗрд╡рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдХреЙрд▓ рдХрд░реЗрдЧреАред рдФрд░ рдХреНрд╡реЗрд░реА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗред

рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рдирд╛ рд╣реИ:



рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

 class HostServer : IDisposable { private Thread mThread; private HttpListener listener; private static string sVersion { get; set; } private static string sName { get; set; } private static string sIPAdress { get; set; } private static List<IPlugin> sPlugins { get; set; } public HostServer(int port) { sVersion = "0.6"; sName = "ISHOST"; sIPAdress = "http://" + System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[0].ToString() + ":" + port.ToString() + "/"; LoadPlugins(); listener = new HttpListener(); listener.Prefixes.Add(sIPAdress); } private static void LoadPlugins() { try { sPlugins = new List<IPlugin>(); string folder = System.AppDomain.CurrentDomain.BaseDirectory; string[] files = System.IO.Directory.GetFiles(folder, "*.dll"); foreach (string file in files) { IPlugin plugin = IsPlugin(file); if (plugin != null) sPlugins.Add(plugin); } } catch (Exception e) { ToLog(e.Message); } } private static IPlugin IsPlugin(byte[] file) { try { System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(file); foreach (Type type in assembly.GetTypes()) { Type iface = type.GetInterface("Interface.IPlugin"); if (iface != null) { IPlugin plugin = (IPlugin)Activator.CreateInstance(type); return plugin; } } } catch (Exception e) { ToLog(e.Message); } return null; } private static IPlugin IsPlugin(string file_url) { try { byte[] b = System.IO.File.ReadAllBytes(file_url); return IsPlugin(b); } catch (Exception e) { ToLog(e.Message); } return null; } public void Start() { mThread = new Thread(new ThreadStart(delegate() { try { listener.Start(); ToLog("Started on " + sIPAdress); while (true) { IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); result.AsyncWaitHandle.WaitOne(); } } catch (Exception e) { if (e.GetType() != typeof(ObjectDisposedException)) ToLog(e.Message); } })); mThread.Start(); } public void Stop() { if (listener != null) listener.Close(); if (mThread != null) mThread.Join(10000); ToLog("Stoped"); } public static void ListenerCallback(IAsyncResult result) { try { HttpListener listener = (HttpListener)result.AsyncState; HttpListenerContext context = listener.EndGetContext(result); HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; using (System.IO.Stream output = response.OutputStream) { if (request.HasEntityBody) { SaveNewPlugin(request.InputStream, response, output); } else { string ans = string.Empty; foreach (IPlugin plugin in sPlugins) { if (request.Url.LocalPath.Replace("/", "").ToLower().StartsWith(plugin.Name.ToLower())) { // Get Parameters from url Dictionary<string, string> query = new Dictionary<string, string>(); for (int i = 0; i < request.QueryString.Keys.Count; i++) { string pName = request.QueryString.Keys[i]; string pValue = Encoding.UTF8.GetString(request.ContentEncoding.GetBytes(request.QueryString[pName])); query.Add(pName, pValue); } //Get data from plugin try { object data = plugin.Data(query); if (data.GetType() == typeof(string)) { ans = (string)data; } else { //Convert data to JSON type ans = request.QueryString["callback"] + "(" + ConvertToJSON(data) + ")"; } } catch (Exception e) { ans = e.Message; } break; } } if (string.IsNullOrEmpty(ans)) { ans = GetMainPage(); } //Send data to user SendMessage(response, output, ans); output.Flush(); output.Close(); } } } catch (Exception e) { if (e.GetType() != typeof(ObjectDisposedException)) ToLog(e.Message); } } private static string GetMainPage() { StringBuilder sb = new StringBuilder(); sb.Append("<html>"); sb.Append("<head>"); sb.Append("<title>ISHOST " + sVersion + "</title>"); sb.Append("</head>"); sb.Append("<body>"); sb.Append("<table cellpadding=\"10px\">"); sb.Append("<thead>"); sb.Append("<tr>"); sb.Append("<td>"); sb.Append("<b>NAME</b>"); sb.Append("</td>"); sb.Append("<td>"); sb.Append("<b>VERSION</b>"); sb.Append("</td>"); sb.Append("<td>"); sb.Append("<b>AUTHOR</b>"); sb.Append("</td>"); sb.Append("</tr>"); sb.Append("</thead>"); foreach (IPlugin plugin in sPlugins) { sb.Append("<tr>"); sb.Append("<td>"); sb.Append(plugin.Name); sb.Append("</td>"); sb.Append("<td>"); sb.Append(plugin.Version); sb.Append("</td>"); sb.Append("<td>"); sb.Append(plugin.Author); sb.Append("</td>"); sb.Append("</tr>"); } sb.Append("</table>"); sb.Append("<div>"); sb.Append("<form action=\"" + sIPAdress + "\" enctype=\"multipart/form-data\" method=\"post\">"); sb.Append("<input type=\"file\" name=\"somename\" size=\"chars\">"); sb.Append("<input type=\"submit\" value=\"Send\">"); sb.Append("</form>"); sb.Append("</div>"); sb.Append("</body>"); sb.Append("</html>"); return sb.ToString(); } private static void SendMessage(HttpListenerResponse response, Stream output, string ans) { byte[] buffer = System.Text.Encoding.UTF8.GetBytes(ans); response.ContentLength64 = buffer.Length; output.Write(buffer, 0, buffer.Length); } private static string ConvertToJSON(object data) { string result = string.Empty; try { result = JsonConvert.SerializeObject(data, Formatting.Indented); } catch (Exception e) { ToLog(e.Message); } return result; } static void ToLog(string text) { try { string folder = System.AppDomain.CurrentDomain.BaseDirectory; using (StreamWriter sw = new StreamWriter(folder + @"\Log.txt", true)) { sw.WriteLine(text+ " : " + DateTime.Now); } } catch { } } public void Dispose() { Stop(); } } 


рдПрдХ рдЯрд┐рдкреНрдкрдгреА, рд╕реЗрд╡рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд▓рдЧрдЗрдиреНрд╕ (DLL) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ dll рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд░реАрдб рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХреАред рдпрд╣ рд╡рд┐рдзрд┐ рдореБрдЭреЗ рд╕реНрдореГрддрд┐ рд╕реЗ рдПрдХ рдЦреБрд▓реА рдбреАрдПрд▓ рдХреЗ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдЕрдирд▓реЛрдбрд┐рдВрдЧ рд╕реЗ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣реА рдереАред
JSON рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкреЛрд░реНрдЯ рдкрд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреЛрдбред

 class Program: ServiceBase { HostServer server; public Program() { this.ServiceName = "ISHOST"; server = new HostServer(28555); } protected override void OnStart(string[] args) { server.Start(); base.OnStart(args); } protected override void OnStop() { server.Stop(); base.OnStop(); } static void Main(string[] args) { System.ServiceProcess.ServiceBase.Run(new Program()); } } 


рд╕реЗрд╡рд╛ рд╕рдВрд╕реНрдерд╛рдкрдХ

 [RunInstaller(true)] public class ISHOSTInstaller : Installer { public ISHOSTInstaller() { var processInstaller = new ServiceProcessInstaller(); var serviceInstaller = new ServiceInstaller(); processInstaller.Account = ServiceAccount.LocalSystem; serviceInstaller.DisplayName = "ISHOST"; serviceInstaller.StartType = ServiceStartMode.Automatic; serviceInstaller.ServiceName = "ISHOST"; this.Installers.Add(processInstaller); this.Installers.Add(serviceInstaller); } } 


InstallUtil.exe рд╕реБрд╡рд┐рдзрд╛ (InstallUtil ISHOST.exe) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реЗрд╡рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рд░реНрд╡рд░ рдкрддреЗ 10.14.3.160 : 28555 рдкрд░ рдЬрд╛рдПрдВрдЧреЗ ред рдпрд╣ рдкреЗрдЬ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЦреБрд▓реЗрдЧрд╛:
рдЫрд╡рд┐

рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдПрдБ

 class TestPlugin : IPlugin { public string Author { get { return "Yura"; } } public string Name { get { return "TestPlugin"; } } public string Version { get { return "0.1"; } } public object Data(Dictionary<string, string> query) { return "<h1>HELLO</h1>"; } } 

рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж, рдлрд┐рд░ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдЬрд╛рдПрдВ, рдФрд░ TestPlugin.dll рдкреНрд▓рдЧрдЗрди рдЪреБрдиреЗрдВ:
рдЫрд╡рд┐

"рднреЗрдЬреЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред

рдЫрд╡рд┐

рдкреНрд▓рдЧрдЗрди TestPlugin рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ

рдЫрд╡рд┐

рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдПрдХрддреНрд░ рдХреА рдЬрд╛рдП, рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рднреА рдмрддрд╛рдпрд╛ рдЬрд╛рдПред
рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИред

Source: https://habr.com/ru/post/In131863/


All Articles