Async HTTPListener (handy for test)

The crux of it is at http://msdn.microsoft.com/en-us/library/system.net.httplistener.begingetcontext%28v=vs.110%29.aspx.

(minor improvement made with use of lamda)

//prefixes are the URLs you want to intercept
public static void NonblockingListener(string [] prefixes)
{
    HttpListener listener = new HttpListener();
    foreach (string s in prefixes)
    {
        listener.Prefixes.Add(s);
    }
    listener.Start();

AsyncCallback callback = new AsyncCallback(
   (result) =>
{
    HttpListener listener = (HttpListener) result.AsyncState;
    // Call EndGetContext to complete the asynchronous operation.
    HttpListenerContext context = listener.EndGetContext(result);
    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();
}

    IAsyncResult result = listener.BeginGetContext(callback, listener);
    // Applications can do some work here while waiting for the  
    // request. If no work can be done until you have processed a request, 
    // use a wait handle to prevent this thread from terminating 
    // while the asynchronous operation completes.
    Console.WriteLine("Waiting for request to be processed asyncronously.");
    //result.AsyncWaitHandle.WaitOne();

    //  Do TEST HERE!!!
    
    Console.WriteLine("Request processed asyncronously.");
    listener.Close();

Note that an easy way to do the callback is a lambda.


Example here: https://github.com/dotnet/corefx/issues/1624

Advertisements
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s