Beispiel #1
0
        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();
        }
Beispiel #2
0
        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.");
        }