11

我需要在 HTTP 处理程序中侦听和处理 HTTP POST 字符串。

以下是将字符串发布到处理程序的代码 -

string test = "charset = UTF-8 & param1 = val1 & param2 = val2 & param3 = val3 & param4 = val4;
byte[] data = Encoding.UTF8.GetBytes(test);
PostData("http://localhost:53117/Handler.ashx", data);

我在 Handler 中尝试的是 -

    public void ProcessRequest(HttpContext context)
    {
        var value1 = context.Request["param1"];
    }

但它为空。如何在 Handler 中监听并获取参数值?

4

3 回答 3

33

您似乎没有使用任何标准请求编码,而是您似乎在重新发明一些自定义协议,因此您不能依赖服务器 ASP.NET 来解析此请求。您必须直接从 InputStream 中读取值:

public void ProcessRequest(HttpContext context)
{
    using (var reader = new StreamReader(context.Request.InputStream))
    {
        // This will equal to "charset = UTF-8 & param1 = val1 & param2 = val2 & param3 = val3 & param4 = val4"
        string values = reader.ReadToEnd();
    }
}

另一方面,如果您使用一些标准的请求编码,例如application/x-www-form-urlencoded您将能够像往常一样读取参数。

以下是此类请求有效负载的样子:

POST /Handler.ashx HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 47
Connection: close

param1=val1&param2=val2&param3=val3&param4=val4

为了发送这样的请求,您可以使用WebClient

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
        { "param3", "value3" },
        { "param4", "value4" },
    };
    byte[] result = client.UploadValues(values);
}

现在在服务器上你可以读取这样的值:

public void ProcessRequest(HttpContext context)
{
    var value1 = context.Request["param1"];
    var value2 = context.Request["param2"];
    ...
}
于 2013-06-08T08:34:19.437 回答
3

它实际上是:

    context.Request.Params["param1"];
于 2014-01-09T12:35:47.470 回答
3

改变

    var value1 = context.Request["param1"];

    var value1 = context.Request.Form["param1"];
于 2013-06-08T08:31:54.897 回答