web-dev-qa-db-ja.com

HTTPハンドラーでHTTP POST?

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

ハンドラで試したのは-

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

しかし、そのヌル。ハンドラーでパラメーター値をリッスンして取得するにはどうすればよいですか?

10
Sandy

標準の要求エンコーディングを使用していないようですが、代わりにカスタムプロトコルを再発明しているようです。そのため、サーバー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"];
    ...
}
31
Darin Dimitrov

それは実際には:

    context.Request.Params["param1"];
3
gafda

変化する

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

    var value1 = context.Request.Form["param1"];
3
Ratna