无法从HttpListenerRequest获取发布数据

时间:2013-03-29 21:05:31

标签: c# html postdata httplistenerrequest

我似乎无法在以下简单的Web服务器应用程序中检索任何帖子数据。 request.InputStream永远不会返回任何内容。

发布表单中的HTML位于代码中。这是非常基本的 - 只需一个,然后提交按钮。

我错过了什么吗?我以前没有使用过HttpListener程序集所以我不知道我是否遗漏了一些简单的东西。我应该使用不同的组件。

非常感谢任何帮助!

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();
    }
}

1 个答案:

答案 0 :(得分:3)

DOH - 我在输入标签中需要一个name属性才能让它显示在帖子数据中。

还有10多个小时我永远不会回来!