рдирдорд╕реНрдХрд╛рд░, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░, рд╕рдВрднрд╡рддрдГ, рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
рдХрд╛рд░реНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд▓рдЧ-рдЗрди рдХреЛ рд╕рд░реНрд╡рд░ (рдкреНрд░рджрд░реНрд╢рди, рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЪрдпрди), рдпрд╛ рдХреБрдЫ рдмрджрд▓рд╛рд╡ (рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ, рдЖрджрд┐) рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЛ рдЯреАрд╕реАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░рд┐рдгрд╛рдо HTML рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рднрд┐рдиреНрди рд╢рд╣рд░реЛрдВ рдореЗрдВ рдХрдИ рд╕рд░реНрд╡рд░ рд╣реИрдВ, рдХрдиреЗрдХреНрд╢рди рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ, рд╕рд░реНрд╡рд░ рдмрд╣реБрдд рдЙрддреНрдкрд╛рджрдХ рдирд╣реАрдВ рд╣реИрдВ, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рджрд┐рди рдореЗрдВ 10 рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХреБрд▓ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рддрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛:
- рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ;
- рд╕реЗрд╡рд╛ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдкрд░ рд╕реБрдирдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рд╕рд░реНрд╡рд░ рдкрддреЗ рдкрд░ рднреА рдЬреЛрдбрд╝рд╛ рдФрд░ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛ред http: //10.14.3.160/);
- рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ JSON рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдФрд░ HTML рдкрд░рд┐рдгрд╛рдо рд╣реИ рддреЛ рдкрд╛рда;
- рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕рд░реНрд╡рд░ рдХреЗ рдкрддреЗ (http://10.14.3.160/pluginname) рдореЗрдВ рдЙрд╕рдХрд╛ рдирд╛рдо рдЬреЛрдбрд╝рдХрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЙрд╕реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (http://10.14.3.160/pluginName?p1/5&p2=8&p3=somevalue);
- рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTML рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдорд┐рд╢реНрд░рдг
- .Net 2.0 рдкрд░ рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рд╕рднреА рд╕рд░реНрд╡рд░ рдкрд░ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рд╕реА # рднрд╛рд╖рд╛ред
рд╡рд┐рдХрд╛рд╕ IPlugin рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ:
namespace Interface { public interface IPlugin { string Name { get; } string Version { get; } string Author { get; } object Data(Dictionary<string, string> query); } }
рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ () рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╕реЗрд╡рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдХреЙрд▓ рдХрд░реЗрдЧреАред рдФрд░ рдХреНрд╡реЗрд░реА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗред
рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рдирд╛ рд╣реИ:
- рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ DLL рдлрд╝рд╛рдЗрд▓реЛрдВ (рдкреНрд▓рдЧрдЗрдиреНрд╕) рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ IPlugin рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
- рдкреЛрд░реНрдЯ рдХреА рдмрд╛рдд рд╕реБрдирдХрд░
- рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдирд┐рдХрд╛рдп рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо url рдкрддреЗ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрддреЗ рдореЗрдВ рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧрдЗрди рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рда (рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЙрд╕ рддрд░рд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ JSON рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рднреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрддреЗ рдореЗрдВ рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреНрд▓рдЧ рдЗрди рдХреА рдПрдХ рд╕реВрдЪреА рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдирдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрдиред
- рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рдХрд╛рдп рд╢рд╛рдорд┐рд▓ рд╣реИ - рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд╡реЗ рд╣рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ, рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рдмрджрд▓реЗрдВред
- рд╣рдо рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рд╕реБрдирдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдПрдХрддреНрд░ рдХреА рдЬрд╛рдП, рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рднреА рдмрддрд╛рдпрд╛ рдЬрд╛рдПред
рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИред