Bill Greer
Bill Greer

Reputation: 3166

How to reuse a HttpListener?

I want to have my application listen for http requests on port 8040. I am using the code below which is a sample that I copied from the web. The problem with the way I have it structured is once a request comes in and a response is generated the listener is closed and the task is returned. How can I restructure the code to keep the listener alive for subsequent requests?

  Task.Factory.StartNew<bool>(() =>
        {

            System.Net.HttpListener listener = new System.Net.HttpListener();
            listener.Prefixes.Add("http://*:8040/");

            listener.Start();
            Console.WriteLine("Listening...");
            // Note: The GetContext method blocks while waiting for a request. 
            HttpListenerContext context = listener.GetContext();              

            HttpListenerRequest request = context.Request;
            // Obtain a response object.
            HttpListenerResponse response = context.Response;
            // Construct a response.
            string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
            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);
            // You must close the output stream.
            output.Close();
            listener.Stop();
            return true;


        });

Upvotes: 1

Views: 1711

Answers (1)

ganchito55
ganchito55

Reputation: 3607

I use the Async method. I use the BeginGetContext for set a callback, so when it receives a request it runs the method RequestCallback.
In the requestCallback I get some data about the request and then I write some data to the response.
Finally I run BeginGetContext again, for process new requests.

Results

In Firefox I got:

Hello Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0

In Chrome I got:

Hello Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36

Code

 public MainWindow()
        {
            InitializeComponent();
            System.Net.HttpListener listener = new System.Net.HttpListener();
            listener.Prefixes.Add("http://localhost:8040/");  
            listener.Start();
            listener.BeginGetContext(RequestCallback, listener);  
        }

 private void RequestCallback(IAsyncResult ar)
        {
            HttpListener listener = (HttpListener) ar.AsyncState;
            var context = listener.EndGetContext(ar);
            var userAgent = context.Request.UserAgent;
            var responseMsg = "Hello " + userAgent;
            var responseMsgBytes = Encoding.UTF8.GetBytes(responseMsg);
            context.Response.ContentLength64 = responseMsgBytes.Length;  //Response msg size
            context.Response.OutputStream.Write(responseMsgBytes,0,responseMsgBytes.Length);
            context.Response.OutputStream.Close();
            listener.BeginGetContext(RequestCallback, listener);  //Enable new requests
        }

Also take a look to this post

I hope this can help you.

Upvotes: 3

Related Questions