単純にテキストデータをHTTPでPOSTするプログラムをC#に移植したいと思っています。

VBScriptからC#への移植です。
dataの中身はString型の単なる複数行文字列です。
サーバ側CGIは、標準入力でクライアントからの文字列を受け取り、そのままテキストファイルにするものです。なので、キーバリュー型ではありません。

移植元プログラム:
http://codepad.org/bXsCPJkd

C#プログラム:
http://codepad.org/KxRJYwPG

(10/7変更)サーバCGI:
http://codepad.org/ZZ0jEgpM

(10/6追加)※文字数オーバーしたので、ソースはcodepadに貼り付けました。

移植元プログラムはしっかり動きます。
C#の方はこのまま実行しても、サーバには0Byteのファイルが出来上がります。
DefaultRequestHeaders.Addの行を有効にすると、"Misused header name"の例外が発生します。
ネット上を検索しても、multipartの例ばかりで、参考になりませんでした。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2015/10/07 17:53:49
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gizmo5 No.2

回答回数504ベストアンサー獲得回数141

ポイント50pt

こちらが参考になると思います。
http://logicalerror.seesaa.net/article/377244421.html

HttpClient cli = new HttpClient();
cli.MaxResponseContentBufferSize = int.MaxValue;
HttpContent content = new FormUrlEncodedContent(data);
var response = await cli.PostAsync(url, content);
String res = await response.Content.ReadAsStringAsync();

data の内容は正しいパラメータ文字列になっていなければいけません。
URL エンコードをする必要があります。
リクエストヘッダには Content-Type を指定できません。
レスポンスヘッダで返ってくるべきものです。

他2件のコメントを見る
id:gizmo5

使うコンストラクタはこちらです。
https://msdn.microsoft.com/en-us/library/hh138198%28v=vs.118%29.aspx

2015/10/07 08:34:17
id:neuromancer_sho

すみません、原因が分かりました!
bashスクリプトの read 命令は1行のみの改行を含まないデータを読めないみたいです。
複数行にしたら、しっかり結果がでました。
VBScriptの試験では、複数行の既存データを使用し、C#ではハードコーディングで単行のデータを書いていた為です。


クライアント側の問題ではありません。お騒がせしました。
お二人共ありがとうございました。勉強になりました。

2015/10/07 17:51:39

その他の回答1件)

id:pogpi No.1

回答回数428ベストアンサー獲得回数59

ポイント50pt

http://dobon.net/vb/dotnet/internet/webrequestpost.html

ここが参考になるかも知れません。

以下追記(10/7)

http://cai.cs.shinshu-u.ac.jp/sugsi/Lecture/php/http/2-arg.html

postDataをキーバリューではなく、送るデータそのものに変えればいいだけではないかと思います。

id:neuromancer_sho

教えて頂いた、dobonのサイトのソース内の、urlとデータだけを置き換えて、UploadStringのパターンと、UploadDataパターンを試しました。

CGIのresponsetextに件数が返ってくるようにしましたが、
VBScriptではちゃんとした件数がでるのに、C#では0件の結果が返ってきます。

2015/10/07 17:40:28
id:neuromancer_sho

すみません、原因が分かりました!
bashスクリプトの read 命令は1行のみの改行を含まないデータを読めないみたいです。
複数行にしたら、しっかり結果がでました。
VBScriptの試験では、複数行の既存データを使用し、C#ではハードコーディングで単行のデータを書いていた為です。


クライアント側の問題ではありません。お騒がせしました。
お二人共ありがとうございました。勉強になりました。

2015/10/07 17:51:52
id:gizmo5 No.2

回答回数504ベストアンサー獲得回数141ここでベストアンサー

ポイント50pt

こちらが参考になると思います。
http://logicalerror.seesaa.net/article/377244421.html

HttpClient cli = new HttpClient();
cli.MaxResponseContentBufferSize = int.MaxValue;
HttpContent content = new FormUrlEncodedContent(data);
var response = await cli.PostAsync(url, content);
String res = await response.Content.ReadAsStringAsync();

data の内容は正しいパラメータ文字列になっていなければいけません。
URL エンコードをする必要があります。
リクエストヘッダには Content-Type を指定できません。
レスポンスヘッダで返ってくるべきものです。

他2件のコメントを見る
id:gizmo5

使うコンストラクタはこちらです。
https://msdn.microsoft.com/en-us/library/hh138198%28v=vs.118%29.aspx

2015/10/07 08:34:17
id:neuromancer_sho

すみません、原因が分かりました!
bashスクリプトの read 命令は1行のみの改行を含まないデータを読めないみたいです。
複数行にしたら、しっかり結果がでました。
VBScriptの試験では、複数行の既存データを使用し、C#ではハードコーディングで単行のデータを書いていた為です。


クライアント側の問題ではありません。お騒がせしました。
お二人共ありがとうございました。勉強になりました。

2015/10/07 17:51:39
id:neuromancer_sho

補足です。

サーバ側のcgiは標準入力でクライアントからの文字列を受け取り、そのままテキストファイルにするものです。

なので、キーバリュー型ではありません。

id:neuromancer_sho

質問文を編集しました。詳細はこちら

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません