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