MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Управление действиями в форме через браузер по локальной сети"
Answer 826203
Можно использовать класс HttpListener в приложении и XMLHttpRequest-запросы в браузерном javascript. Допустим, мы хотим создать веб-интерфейс для своего приложения, который может выполнять определенные команды. Для этого нам нужно создать HttpListener, привязанный к какому-то локальному URL, в фоновом потоке. Этот поток будет разбирать параметры URL, выполнять необходимые действия и отправлять ответ. На клиентской стороне в браузерном JS будем считывать данные из input и отправлять асинхронный запрос к нашему серверу с соответствующим параметром.
В примере ниже сервер реагирует на два URL: на
/myapp/index.aspx
отдается веб-интерфейс, а/myapp/command.aspx?command=...&argument=...
используется для отправки команд. Для того, чтобы все это взлетело, приложение должно запускаться либо с учетной записи администратора, либо нужно предварительно открыть порт для простых пользователей выполнением следующей команды в командной строке администратора:netsh http add urlacl url=http://+:8080/ sddl=D:(A;;GX;;;S-1-2-0)
(Идентификатор S-1-2-0 соответствует группе всех локальных пользователей). Также возможно понадобится добавить программу в исключения фаервола и т.п. Для отладки можно заменить + на localhost, тогда можно будет работать с локального компьютера без необходимости установки ACL.
Код C#:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Windows.Forms; using System.Net; namespace WindowsFormsTest1 { public partial class Form1 : Form { string htmlString = System.IO.File.ReadAllText("frontend.html"); void Print(string text) { if(text==null)text = ""; this.BeginInvoke((MethodInvoker)(() => { textBox1.Text += text + Environment.NewLine; })); } void CloseWindow() { this.BeginInvoke((MethodInvoker)(() => { this.Close(); })); } //метод для серверного потока public void RunServer() { // Create a listener. HttpListener listener = new HttpListener(); // Add the prefixes. listener.Prefixes.Add("http://+:8080/myapp/"); listener.Start(); while (true) { HttpListenerContext context = listener.GetContext(); HttpListenerRequest request = context.Request; string url = request.RawUrl; HttpListenerResponse response = context.Response; // Construct a response. if (url.StartsWith("/myapp/index.aspx") == false && url.StartsWith("/myapp/command.aspx") == false) { //вернуть ошибку при неверном URL response.StatusCode = 404; response.StatusDescription = "Not found"; response.Close(); continue; } //разбираем параметры запроса string command = request.QueryString["command"]; string argument = request.QueryString["argument"]; string responceString = ""; if (url.StartsWith("/myapp/index.aspx")) { responceString = htmlString; //вернуть веб-интерфейс } else { //обработать команду if(String.IsNullOrEmpty(command)) command = "help"; if (argument == null) argument = ""; switch (command) { case "print": Print(argument); responceString = "OK"; break; case "help": responceString = "Commands: print, close, help"; break; case "close": CloseWindow(); responceString = "OK"; break; default: responceString = "Unknown command"; break; } } byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responceString); // Get a response stream and write the response to it. response.Headers.Add("Expires: Tue, 01 Jul 2000 06:00:00 GMT"); response.Headers.Add("Cache-Control: max-age=0, no-cache, must-revalidate"); response.ContentLength64 = buffer.Length; System.IO.Stream output = response.OutputStream; System.IO.BinaryWriter wr = new System.IO.BinaryWriter(output); using (wr) { wr.Write(buffer); } } } public Form1() { InitializeComponent(); //запускаем серверный поток System.Threading.Thread th = new System.Threading.Thread(RunServer); th.IsBackground = true; th.Start(); } } }
Файл frontend.html:
<html><head><script type="text/javascript"> function reqReadyStateChange() { if (window.xhr.readyState == 4) { var status = window.xhr.status; if (status == 200) { document.getElementById('ta').value = window.xhr.responseText; } else { document.getElementById('ta').value = window.xhr.statusText; } } } function request(url){ document.getElementById('ta').value = ''; window.xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onreadystatechange = reqReadyStateChange; xhr.send(); } </script></head> <body><form> Command: <input type="text" id="inpCommand"/><br/> Argument: <input type="text" id="inpArgument"/><br/> <input type="button" onClick="request('/myapp/command.aspx?command='+document.getElementById('inpCommand').value+'&argument='+document.getElementById('inpArgument').value);" value="Execute"/> <br/><br/> <textarea id="ta" rows = "10" cols = "45"></textarea> </form></body></html>
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.