- PR -

HttpWebRequestによるPOST送信について。

1
投稿者投稿内容
hourseX
会議室デビュー日: 2004/12/07
投稿数: 11
投稿日時: 2004-12-23 22:41
Webクライアントのプログラムについて、
ログイン認証のフォームにPOSTでデータ送信後、
WebResponseで応答を確認することまではできたのですが、
その後のWebフォームに更にPOSTで送信するには
どのようにすればよいのでしょうか?

流れとしては
WebRequest.Create(***)
GetRequestStream
reqStream.Write(postDataBytes
req.GetResponse
ReadToEnd
ここまで出来ていて、
その後のresponseのWebフォームにPOSTで
データを送信しようとしているところです。

ユーザ認証後の次のWebフォームへの
RequestStreamはどのようにして得ればよいものでしょうか?
アドバイスをよろしくお願いいたします。

[ メッセージ編集済み 編集者: hourseX 編集日時 2004-12-23 22:45 ]
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-12-24 12:45
Cookieの面倒を見る必要があるでしょう。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-12-25 02:13
引用:
WebRequest.Create(***)
GetRequestStream
reqStream.Write(postDataBytes
req.GetResponse
ReadToEnd

せっかく書くならコード書いた方がいいのでは?
これだとどのインスタンスに何をしたのかわかりにくいです。

そもそもこれはWEBアプリですか?WINDOWSアプリですか?
引用:
ログイン認証のフォームにPOSTでデータ送信後、
WebResponseで応答を確認することまではできたのですが、
その後のWebフォームに更にPOSTで送信するには

WINDOWSアプリですかね。それなら、両方「フォームにPOSTで送信」と
書いてありますので、同じようにやったらできないですか?

もしかしてWEBアプリで、クライアント(ブラウザ)からアクセスされたときに、
プログラム上でどこか別の所にPOSTしてその結果をクライアントに返したい、
ってことですか?だったらPageクラスのResponseプロパティですね。
WebResponseで応答を確認しReadToEndまでできてるなら

Response.Clear();
Response.Write(sr.ReadToEnd());
Response.End();
sr.Close();
としてみてください。
hourseX
会議室デビュー日: 2004/12/07
投稿数: 11
投稿日時: 2004-12-25 14:44
有難うございます。
作ろうとしているのはWindowsアプリで、
コマンドボタンを押したらログイン認証とその後の
商品発注を自動で行うプログラムです。

以下、ソースです。

private void button16_Click(object sender, System.EventArgs e)
{
cContainer =
new System.Net.CookieContainer();
/*
*認証手続き(ログイン)
*
*/

//文字コードを指定する
System.Text.Encoding enc =
System.Text.Encoding.GetEncoding("shift_jis");

//POST送信する文字列を作成
string postData =
"_ControlID=
+"&_DataStoreID=
+"&_PageID=
+"&getFlg=
+"&user_id=
+"&user_password=
+"&_ActionID=


//バイト型配列に変換
byte[] postDataBytes = System.Text.Encoding.ASCII.GetBytes(postData);

//WebRequestの作成
HttpWebRequest req =
(HttpWebRequest)WebRequest.Create("https://");

req.Timeout = 5000;
//CookieContainerプロパティを設定する
req.CookieContainer = new System.Net.CookieContainer();
//要求元のURIに関連したCookieを追加し、要求に使用する
req.CookieContainer.Add(cContainer.GetCookies(req.RequestUri));


//メソッドにPOSTを指定
req.Method = "POST";

req.Proxy = System.Net.WebProxy.GetDefaultProxy();
//POSTの場合は通常"application/x-www-form-urlencoded"を使う
req.ContentType = "application/x-www-form-urlencoded";
//POST送信するデータの長さを指定
// req.ContentLength = postDataBytes.Length;

//データをPOST送信するためのStreamを取得
System.IO.Stream reqStream = req.GetRequestStream();
//ContentTypeを"application/x-www-form-urlencoded"にする
//送信するデータを書き込む
reqStream.Write(postDataBytes, 0 , postDataBytes.Length);
reqStream.Close();

//サーバーからの応答を受信するためのWebResponseを取得
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();

//受信したCookieのコレクションを取得する
System.Net.CookieCollection cookies =
req.CookieContainer.GetCookies(req.RequestUri);
//Cookie名と値を列挙する
foreach (System.Net.Cookie cook in cookies)
Console.WriteLine("{0}={1}", cook.Name, cook.Value);
//取得したCookieを保存しておく
cContainer.Add(cookies);



//応答データを受信するためのStreamを取得
System.IO.Stream resStream = res.GetResponseStream();


//受信して表示
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc);


textBox1.Text += sr.ReadToEnd();

//閉じる
sr.Close();

//以下問題あり


//取引画面へ移動
//POST送信する文字列を作成
string postData2 = ***



//バイト型配列に変換
byte[] postDataBytes2 = System.Text.Encoding.ASCII.GetBytes(postData2);
// //データをPOST送信するためのStreamを取得
System.IO.Stream reqStream2 = req.GetRequestStream();

//送信するデータを書き込む
reqStream2.Write(postDataBytes2, 0 , postDataBytes2.Length);



「//以下問題あり」以下は、正常に動きません。
System.IO.Stream reqStream2 = req.GetRequestStream();
の辺りがおかしいのかとは思っているのですが。
このプログラムを実行すると「接続が予期せず閉じられました。」の
エラーメッセージが出てしまいます。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-12-26 09:46
同様の現象を確認しました。
reqStream2.Write(postDataBytes2, 0 , postDataBytes2.Length);
の時点でreqStream2.CanWriteがfalseになっていませんか?

これって再度同じUriにPOSTしたいってことですか?
とりあえず
System.IO.Stream reqStream2 = req.GetRequestStream();
ここでreqを流用しないで、別のWebRequestを作り直して試してみてはどうですか?
1

スキルアップ/キャリアアップ(JOB@IT)