人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

単純にテキストデータを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の例ばかりで、参考になりませんでした。

●質問者: neuromancer_sho
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pogpi
●50ポイント

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をキーバリューではなく、送るデータそのものに変えればいいだけではないかと思います。


neuromancer_shoさんのコメント
教えて頂いた、dobonのサイトのソース内の、urlとデータだけを置き換えて、UploadStringのパターンと、UploadDataパターンを試しました。 CGIのresponsetextに件数が返ってくるようにしましたが、 VBScriptではちゃんとした件数がでるのに、C#では0件の結果が返ってきます。

neuromancer_shoさんのコメント
すみません、原因が分かりました! bashスクリプトの read 命令は1行のみの改行を含まないデータを読めないみたいです。 複数行にしたら、しっかり結果がでました。 VBScriptの試験では、複数行の既存データを使用し、C#ではハードコーディングで単行のデータを書いていた為です。 クライアント側の問題ではありません。お騒がせしました。 お二人共ありがとうございました。勉強になりました。

2 ● gizmo5
●50ポイント ベストアンサー

こちらが参考になると思います。
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 を指定できません。
レスポンスヘッダで返ってくるべきものです。


neuromancer_shoさんのコメント
ありがとうございます。 FormUrlEncodedContentのコンストラクタの引数はIEnumerable<KeyValuePair<string, string>> なので、string型のdataは受け取れませんね。 やりたいのはキーバリュー型ではなく、ベタ書きプレーンテキストの送信なんです。

gizmo5さんのコメント
&gt; FormUrlEncodedContentのコンストラクタの引数はIEnumerable<KeyValuePair<string, string>> なので、string型のdataは受け取れませんね。 StringContent を使いましょう。 https://msdn.microsoft.com/en-us/library/system.net.http.stringcontent%28v=vs.118%29.aspx

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

neuromancer_shoさんのコメント
すみません、原因が分かりました! bashスクリプトの read 命令は1行のみの改行を含まないデータを読めないみたいです。 複数行にしたら、しっかり結果がでました。 VBScriptの試験では、複数行の既存データを使用し、C#ではハードコーディングで単行のデータを書いていた為です。 クライアント側の問題ではありません。お騒がせしました。 お二人共ありがとうございました。勉強になりました。

質問者から

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


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ