※ ChatGPTを利用し、要約された質問です(原文:System.Net.HttpWebRequest、もしくはSystem.Net.Sockets を使ったネットワークプログラミングについて(C#))
C#ネットワークプログラミングで問題が発生しています
このQ&Aのポイント
C#のネットワークプログラミングにおいて、HttpWebRequestおよびSocketsクラスを使用して一般的なWeb操作を行おうとしています。
HttpWebRequestクラスを使用した場合、ログインは成功しますが、2回目の操作でログイン状態が保持されずに問題が発生します。
Socketsクラスを使用した場合も、ログインがうまくいかず、Sendメソッドを呼び出した時点でAvailableプロパティの値が常に0になります。
System.Net.HttpWebRequest、もしくはSystem.Net.Sockets を使ったネットワークプログラミングについて(C#)
一般的なWeb操作(サイトにログインして、そのログインした状態を保持したまま
そのサイトを閲覧する)といった内容をプログラム上でやりたいと考えています。
当初、HttpWebRequestクラスを使って組んでみました。
結果は、ログインすることは成功するのですが、2回目に別操作のPOSTを実行しよう
とすると、HttpWebRequestインスタンスを再作成せねばならず、ログインした状態が
保持できない状態でのPOSTとなり、うまくいきませんでした。
なので、Socketsクラスを用いて挑戦しているのですが、こちらもうまくいってない状況です。
その状況とは、サイトにログイン(POST)する所がうまくいかないのですが、
コードレベルでいうとSendメソッドを発行した際、Availableプロパティの値が
必ず0になってしまうということです。
この状況までのポイントを記述します。
1.ソケットの接続先ホストのポートは443
2.Connect直後のConnectedはtrue
3.POSTメッセージはHttpWebRequestで成功したメッセージと全く同様
(つまり、メッセージ自体に問題はないはず?!)
4.Send直後のSelectMode.SelectWriteをPoll結果はtrue
5.Send直後のAvailable = 0
個人的に気になるのは、HttpWebRequest、Socketsそれぞれの通信のパケットを
キャプチャしてみると、HttpWebRequestの時はSSLによるhandshakeプロトコルのやりとりが
見られるのですが、Socketsの時はhandshakeプロトコルは見られず、POSTメッセージを平文で投げています。
このことからもSocketsクラスでのコーディングに何かの処理が足りない、もしくは
どこかが間違っていると思われるのですが、自身では頭打ちといったところです。
回答につきましては、上記問題の解決だけにあらず、冒頭の操作を実行するには
こうした方が簡単、分かりやすい。といった意見でもかまいません。
どうぞ、よろしくお願いいたします。
お礼
todo36さん、早速の回答ありがとうございました。 アドバイスを頂いてから、今日までいろいろコツコツと 試行錯誤しておりました。 まずSocketsクラスによる手法は「私には敷居が高いな。」 と判断して即、諦めました。 次に、WebBrowserクラスを試してみようと思い、いろいろ 調べてみました。すると、このクラスはフレームワーク2.0 からのサポートのようで、自身が使っているのは基本が1.0 であるNET2002でした。そしてここでもdllのバージョンを 2.0に切替える術が分からず断念してしまいました。 で、最後に最初に挑戦したHttpWebRequestクラスでのCookie の面倒をみてみることにしました。 これがやっとうまくいきました。ありがとうございました。 誠に厚かましいお願いですが、上記にある参照フレームワーク のバージョンを変更する手段をご存知でしたらご回答頂けない でしょうか。 よろしくお願い致します。