Search code examples
c#htmlpostdatahttplistenerrequest

Unable to get post data from HttpListenerRequest


I can't seem to retrieve any post data in the following simple web server application. The request.InputStream never returns anything.

The HTML from the posting form is in the the code. It's very basic - just a , and submit button.

Am I missing something? I haven't used the HttpListener assembly before so I don't know if I'm missing something simple. Is there a different assembly I should be using.

Any help would be very much appreciated!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        WebServer ws = new WebServer(SendResponse, "http://localhost:8088/");
        ws.Run();
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
        ws.Stop();
    }

    public static string SendResponse(HttpListenerRequest request)
    {
        try
        {
            using (System.IO.StreamReader reader = new System.IO.StreamReader(request.InputStream, request.ContentEncoding))
            {
                string s = reader.ReadToEnd();
                Console.WriteLine("InputStream: {0}", s);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex.Message);
        }

        return @"<html><body><form action='http://localhost:8088/' method='post'><input type='text' value='My Input'><input type='submit'></form></body></html>";
    }
}

public class WebServer
{
    private readonly HttpListener _listener = new HttpListener();
    private readonly Func<HttpListenerRequest, string> _responderMethod;

    public WebServer(string[] prefixes, Func<HttpListenerRequest, string> method)
    {
        foreach (string s in prefixes)
            _listener.Prefixes.Add(s);

        _responderMethod = method;
        _listener.Start();
    }

    public WebServer(Func<HttpListenerRequest, string> method, params string[] prefixes) : this(prefixes, method) { }

    public void Run()
    {
        ThreadPool.QueueUserWorkItem((o) =>
        {
            Console.WriteLine("Listening...");
            try
            {
                while (_listener.IsListening)
                {
                    ThreadPool.QueueUserWorkItem((c) =>
                    {
                        var ctx = c as HttpListenerContext;
                        try
                        {
                            string rstr = _responderMethod(ctx.Request);
                            byte[] buf = Encoding.UTF8.GetBytes(rstr);
                            ctx.Response.ContentLength64 = buf.Length;
                            ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                        }
                        catch {}
                        finally
                        {
                            ctx.Response.OutputStream.Close();
                        }
                    }, _listener.GetContext());
                }
            }
            catch {}
        });
    }

    public void Stop()
    {
        _listener.Stop();
        _listener.Close();
    }
}

Solution

  • DOH - I needed a name attribute in the input tag to get it to show up in the post data.

    There's 10+ hours I'll never get back!