protected override void OnDoWork(DoWorkEventArgs e) { WebServerDelivererArgs args = (WebServerDelivererArgs)e.Argument; if (String.IsNullOrEmpty(Thread.CurrentThread.Name)) { Thread.CurrentThread.Name = this.GetType().Name + "_" + args.ID; } HttpListenerRequest request = args.Context.Request; // Obtain a response object. HttpListenerResponse response = args.Context.Response; // Construct a default response. string responsestring = "<HTML><BODY> Welcome to AirScout!</BODY></HTML>"; // check for content delivery request if (request.RawUrl.ToLower() == "/planes.json") { responsestring = DeliverPlanes(); } else if (request.RawUrl.ToLower().StartsWith("/version.json")) { responsestring = DeliverVersion(request.RawUrl); } else if (request.RawUrl.ToLower().StartsWith("/settings.json")) { responsestring = DeliverSettings(request.RawUrl); } else if (request.RawUrl.ToLower().StartsWith("/location.json")) { responsestring = DeliverLocation(request.RawUrl); } else if (request.RawUrl.ToLower().StartsWith("/qrv.json")) { responsestring = DeliverQRV(request.RawUrl); } else if (request.RawUrl.ToLower().StartsWith("/elevationpath.json")) { responsestring = DeliverElevationPath(request.RawUrl); } else if (request.RawUrl.ToLower().StartsWith("/propagationpath.json")) { responsestring = DeliverPropagationPath(request.RawUrl); } else if (request.RawUrl.ToLower().StartsWith("/nearestplanes.json")) { responsestring = DeliverNearestPlanes(request.RawUrl, args.AllPlanes); } // copy bytes to buffer byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responsestring); // Get a response stream and write the response to it. response.ContentLength64 = buffer.Length; System.IO.Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); // Thread.Sleep(1000); // You must close the output stream. output.Close(); }
private void bw_Webserver_DoWork(object sender, DoWorkEventArgs e) { // name the thread for debugging if (String.IsNullOrEmpty(Thread.CurrentThread.Name)) { Thread.CurrentThread.Name = this.GetType().Name; } Log.WriteMessage("started."); // run simple web server string hosturl = "http://+:" + Properties.Settings.Default.Webserver_Port.ToString() + "/"; string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; HttpListener listener = null; while (!bw_Webserver.CancellationPending) { string[] prefixes = new string[1]; prefixes[0] = hosturl; int id = 0; try { if (!HttpListener.IsSupported) { Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class."); return; } // URI prefixes are required, if (prefixes == null || prefixes.Length == 0) { throw new ArgumentException("prefixes"); } // Create a listener. listener = new HttpListener(); // Add the prefixes. foreach (string s in prefixes) { listener.Prefixes.Add(s); } listener.Start(); Console.WriteLine("Listening..."); while (!bw_Webserver.CancellationPending) { // Note: The GetContext method blocks while waiting for a request. HttpListenerContext context = listener.GetContext(); List <PlaneInfo> allplanes = Planes.GetAll(DateTime.UtcNow, Properties.Settings.Default.Planes_Position_TTL); id++; // send response from a background thread WebServerDelivererArgs args = new WebServerDelivererArgs(); args.ID = id; args.Context = context; args.AllPlanes = allplanes; WebserverDeliver bw = new WebserverDeliver(); bw.RunWorkerAsync(args); } } catch (HttpListenerException ex) { if (ex.ErrorCode == 5) { // gain additional access rights for that specific host url // user will be prompted for allow changes // DO NOT USE THE "listener=yes" option as recommended!!! string args = "http add urlacl " + hosturl + " user="******"netsh", args); psi.Verb = "runas"; psi.CreateNoWindow = true; psi.WindowStyle = ProcessWindowStyle.Hidden; psi.UseShellExecute = true; Process.Start(psi).WaitForExit(); } } catch (Exception ex) { // do almost nothing // wait 10 seconds and restart the listener Thread.Sleep(10000); } finally { } } if (listener != null) { lock (listener) { listener.Stop(); } } Log.WriteMessage("Finished."); }