private void Listen(object state) { HttpListenerCallbackState callbackState = (HttpListenerCallbackState)state; while (callbackState.Listener.IsListening) { callbackState.Listener.BeginGetContext(new AsyncCallback(ListenerCallback), callbackState); int n = WaitHandle.WaitAny(new WaitHandle[] { callbackState.ListenForNextRequest, stopEvent }); if (n == 1) { // stopEvent was signalled callbackState.Listener.Stop(); break; } } }
public void ListenAsynchronously(IEnumerable <string> prefixes) { try { using (HttpListener listener = new HttpListener()) { foreach (string s in prefixes) { listener.Prefixes.Add(s); } listener.Start(); HttpListenerCallbackState state = new HttpListenerCallbackState(listener); ThreadPool.QueueUserWorkItem(Listen, state); } } catch { } }
private void ListenerCallback(IAsyncResult ar) { HttpListenerCallbackState callbackState = (HttpListenerCallbackState)ar.AsyncState; HttpListenerContext context = null; int requestNumber = Interlocked.Increment(ref requestCounter); try { context = callbackState.Listener.EndGetContext(ar); } catch (Exception ex) { return; } finally { callbackState.ListenForNextRequest.Set(); } if (context == null) { return; } HttpListenerRequest request = context.Request; Console.WriteLine("\r\nServer Request"); string responseMicrocontroller = ""; if (request.HasEntityBody) { System.IO.Stream body = request.InputStream; System.Text.Encoding encoding = request.ContentEncoding; System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); if (request.ContentType != null) { Console.WriteLine("Client data content type {0}", request.ContentType); } string s = reader.ReadToEnd(); responseMicrocontroller = EnviarComandoPanda(s); body.Close(); reader.Close(); } if (string.IsNullOrEmpty(responseMicrocontroller)) { responseMicrocontroller = "NO"; } try { using (HttpListenerResponse response = context.Response) { //response stuff happens here Console.WriteLine("Send data from web: " + responseMicrocontroller); byte[] buffer = Encoding.UTF8.GetBytes(responseMicrocontroller); response.ContentLength64 = buffer.LongLength; response.OutputStream.Write(buffer, 0, buffer.Length); context.Response.OutputStream.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } try { context.Response.Close(); } catch { } }