DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#によるCGIのPOST受信について

環境/言語:[VS2003@C#]
分類:[.NET]

C#でASP.netではなくCGIを作ろうとしています。
IISを使えばいい話なのですが、どうしてもANHTTPDを使用したいためにASP.netではなくCGIにしました。(好奇心てのもあるのですが。。。)
Google先生などとも相談したのですが、やはりC#でCGIを作った事例が殆どなく、ネット中を探してもめぼしい情報が手に入りませんでした。

そこで疑問なのですが、Perlで作成したCGIなどなら
xxx.cgi?mode=root&id=abc&pass=123
などのようにGETやPOST(この場合はGET)で渡すことができますが
C#のCGIはargs[]に入れる為に
xxx.exe?root&abc&123
という書式でないといけないんです。(=を入れることができませんので)
この場合、args[0]にrootが入り、args[1]にabc、args[2]に123が入ります。

ただ、HTMLのフォームなどからPOSTやGETで送信する場合はどうしても
xxx.exe?mode=root
みたいな書式になってしまうんですよね・・・
受け取ろうとして配列にいれる瞬間にすでにエラーになってしまいます。

ASP.netなら
string mode = Request.Form["mode"];
みたいに受け取れるそうなのですが・・・

実験的な試みなのですが、どうかご助言お願い致します。
> 受け取ろうとして配列にいれる瞬間にすでにエラーになってしまいます。

スタートアップエントリを

static void Main (string[] args)

ではなく

static void main()

の形式にすればよいのでは?

GET の時のクエリは環境変数 QUERY_STRING から取得すればいいし、POST の時は標準入力から取得すればよいかと。
素早いご返答有り難う御座います!
さっそくPOSTを標準入力したところ、無事受け取ることができました。
ただ、POSTで受け取った日本語が文字化けしてしまうんです。
一応、下のページでテキストボックスに文字を入れるとCGIにPOSTで送信して
CGIがそのまま出力するのですが
http://www.mythique.org/cgi-bin/
「実験」と入力してPOSTで送信すると
textfield=%8E%C0%8C%B1
になってしまうんですよ(泣

日本語文字コードの問題だと思うのですが、どのように変換すべきなのでしょうか?
少し試行錯誤したところ、一応文字化けが解消することができました。
System.Text.Encoding enc = System.Text.Encoding.GetEncoding(932);
string pstData = Console.In.ReadToEnd();
byte[] bytData = System.Text.Encoding.ASCII.GetBytes(pstData);
string strData = System.Web.HttpUtility.UrlDecode(bytData, 0, bytData.Length, enc);
Console.Write("Content-type: text/html\n\n");
Console.WriteLine(strData);
このようにPOSTから受け取ったデータをデコードしたのですが良いでしょうか?
どうもstringをbyte[]にしてstringに戻すという動作に無駄がある気がして・・・
> このようにPOSTから受け取ったデータをデコードしたのですが良いでしょうか?

間違っています。

CGI の標準入力への入力が「必ず string に格納できる」と仮定するのはよくありません。

標準入力は byte[] などに受けて、適切なエンコーディングで GetString() で string に変換してください。
私もそう思ったのですが、
Console.In.ReadToEnd();
自体がstringしか受け取れないのですよね・・・
標準入力からstring以外を受け取る方法ってあるのでしょうか?

よろしくおねがいいたします、
> Console.In.ReadToEnd();
> 自体がstringしか受け取れないのですよね・・・
> 標準入力からstring以外を受け取る方法ってあるのでしょうか?

Console.OpenStandardInput メソッドのヘルプのサンプルを参考にするといいんじゃないでしょうか。

DOBON.NET | プログラミング道 | プログラミング掲示板