- - PR -
HttpWebRequestによるPOST送信について。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2004-12-24 12:45
Cookieの面倒を見る必要があるでしょう。
| ||||||||
|
投稿日時: 2004-12-25 02:13
これだとどのインスタンスに何をしたのかわかりにくいです。 そもそもこれはWEBアプリですか?WINDOWSアプリですか?
書いてありますので、同じようにやったらできないですか? もしかしてWEBアプリで、クライアント(ブラウザ)からアクセスされたときに、 プログラム上でどこか別の所にPOSTしてその結果をクライアントに返したい、 ってことですか?だったらPageクラスのResponseプロパティですね。 WebResponseで応答を確認しReadToEndまでできてるなら Response.Clear(); Response.Write(sr.ReadToEnd()); Response.End(); sr.Close(); としてみてください。 | ||||||||
|
投稿日時: 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(); の辺りがおかしいのかとは思っているのですが。 このプログラムを実行すると「接続が予期せず閉じられました。」の エラーメッセージが出てしまいます。 | ||||||||
|
投稿日時: 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