ASP.NET method=POST
ASP.NETでPOSTしたデータを引き取る方法についてのメモ。
実験環境
クライアントはC#で記述したWinアプリ。
サーバーはIIS上に構築したASP.NETのWebページ。
■クライアント側のプログラム
クライアント側のプログラムでは、WebRequestを使ってPOSTしてみた。
データはWebRequestから取得したストリームに対して書き込みを行うことでサーバーへ渡される。
MethodはもちろんPOST。
【関数】
public string Post(string Url,string PostData)
引数にURL、POSTするデータを指定する。
【引数】
■string Url
URLにはQuery文字列を含ませても良い。
例)string url="http://myserver/req.aspx?cmd=10&opt=0";
■string PostData
POSTするデータはそのまま送られるので、漢字を含む文字列の場合UrlEncodeを行う必要がある。
System.Text.Encoding encode =System.Text.Encoding.GetEncoding("shift_jis");
// 文字列をエンコード
string data=System.Web.HttpUtility.UrlEncode("サンプル文字列", encode);
// POSTする。
Post(url,data);
【戻り値】
応答したページのレスポンス。
【コード】
public string Post(string Url,string PostData)
{
//PostDataをバイト型配列に変換
byte[] dBytes = System.Text.Encoding.ASCII.GetBytes(PostData);
//WebRequestの作成
HttpWebRequest webreq =(HttpWebRequest) WebRequest.Create(Url);
//MethodにPOSTを指定
webreq.Method = "POST";
//ContentTypeの指定
webreq.ContentType = "application/x-www-form-urlencoded";
// 出力ストリームを取得し、データを書き込む。
webreq.ContentLength = postDataBytes.Length;
System.IO.Stream rs = webreq.GetRequestStream();
rs.Write(dBytes, 0, dBytes.Length);
rs.Close();
//応答の受信のためのWebResponseを取得
HttpWebResponse webres =(HttpWebResponse) webreq.GetResponse();
//応答データの受信のためのStreamを取得
Stream st = webres.GetResponseStream();
StreamReader sr = new StreamReader(st, Encoding.GetEncoding("shift_jis"));
//受信データの取得。
string aspx = sr.ReadToEnd();
sr.Close();
return aspx;
}
■サーバー側のプログラム
サーバーではPOSTされたデータは標準入力にあるので、これを引き取ればOK。
サーバー側のプログラムは、意外に簡単。
PageのRequestオブジェクトを利用してデータを取得する。
【関数】
private string GetPostData()
引数はなし。
【戻り値】
取得したデータを文字列にして戻り値とする。
何も入っていない場合はnullを返す。
【コード】
private string GetPostData()
{
int len=Request.ContentLength;
if( len != 0)
{ byte[] bdata=Request.BinaryRead(len);
string Data =System.Text.Encoding.ASCII.GetString(bdata);
return Data;
}
return null;
}
【解説】
PageオブジェクトにはRequestオブジェクトが公開されているので、これを利用する。
RequestのContentLengthプロパティに、POSTされたデータの長さが入っている。
データはBinaryReadを使って一旦バイト配列へ格納する。
これをTextクラスのEncodingを使って文字列へ変換する。
POSTしたデータがUrlEncodeされている場合は、UrlDecodeを行う必要がある。
例)
string Data=GetPostData();
if( Data != null)
{ Data=Server.UrlDecode(Data);
}
|