- 締切済み
C# WebRequestでcookieの設定
webbrowserで取得したcookieをwebrequestに設定してアクセスする事を考えております。 webBrowser1.Document.Cookie;で取得したcookieをそのままwebrequestに設定しようとすると、 string型ではダメと言われてしまいます。 どのようにすれば良いか、ご教授頂ければありがたいです。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
>HttpOnlyでは…なさそうです。 >別のとこが間違えているんでしょうか。 cookieでセッション管理していない…という可能性も捨てきれないところでしょうかねぇ……。 URLのパラメータにセッション管理用のIDとか入っている…とか。 「HTTP セッション管理」とかで検索するとそれなりに見つかるかと思われます。 IEなどのブラウザでアクセスする際にブラウザの設定で「cookieを受け入れない」とかにしても ログイン処理がされている場合は、cookie以外での管理がされている……ということになりますね。
- Wr5
- ベストアンサー率53% (2173/4061)
WireSharkの使い方に関しては…自力で調べて欲しいところですが…… 「WireShark HTTP ヘッダ」辺りで検索すれば、それなりに見つかるでしょう。 で、HTTPレスポンスヘッダのうち、「Set-Cookie」というヘッダを確認し、 HttpOnlyの文字があったらHttpOnly属性付きですから、webBrowser1.Document.Cookie.Replace(";" , ",")ではダメ…ということになります。
お礼
set-cookieついに見つけましたぁぁぁっ! Set-Cookie: PHPSESSID=777444c6076f709bfad988f1a2fd14ba; path=/\r\n HttpOnlyでは…なさそうです。 別のとこが間違えているんでしょうか。 引き続き何か進展あれば、補足にでも書き足します。 本当にありがとうございます。
- Wr5
- ベストアンサー率53% (2173/4061)
お礼と補足、使い切ったらその後が続かないんでしょうが…… >…で…迷い込みました。 では状況が不明です。 HttpOnly属性のcookieだった…ということはありませんか? # WireSharkなどでwebBrowser1の通信内容確認した方が良いかと。
お礼
毎度、お世話になっております。 WireSharkの存在すら知らなかったもので、調べ方が合っているのか微妙に自信薄ですが…。 目的のURLぽいものは、末尾が .php HTTP/1.1 と、なっており、protocol?もHTTPとなっておりました。 filterをonlyとしてもエラーが出てどうも無い様です。 その為、HttpOnly属性では無いと思われますが、何か間違っておりますでしょうか。 重ね重ね質問をぶつける形になってしまい、恐縮ですが、何卒宜しくお願い致します。
- Wr5
- ベストアンサー率53% (2173/4061)
>//を取るとcc.Add(cookie);で強制終了します。 やってみました。 ……他にもプロパティを設定しないとダメ…っぽいですね。 で…… 「c# webbrowser cookie 取得」で検索して、 http://ycouriel.blogspot.jp/2010/07/webbrowser-and-httpwebrequest-cookies.html なんてのを見つけました。 >cookieクラスのインスタンスを作成して~ ってのは誤り…ですね。 # 必要ななプロパティを設定すればいいんでしょうけど…その情報が取得できるかが問題になる。 webbrowserコントロールで取得したcookieはIEと共通で保存されている……んでしょうかねぇ。 リンク先の最初の例のコードだと、取得できないものがある……らしいです。 # HttpOnly属性のついたもの…ということに。 # cc.SetCookies(webBrowser1.Url, webBrowser1.Document.Cookie.Replace(";" , ",")); # ではダメ…ということになりますかね。 HttpOnly属性については…検索するとそこそこ出てくるでしょう。 PHPですが http://d.hatena.ne.jp/t_komura/20060812/1155349717 とか。 # HttpOnly属性が使われていない。ということならば、上記のwebBrowser1.Document.Cookie.Replace(";" , ",")でOKなんですかねぇ。
お礼
早速の回答本当にありがとうございます。 リンク先を確認した所…ガッツリ英語ですね…。 いや、なんとなく分かるような気がしないでもないです。 引き続きやってみます。
補足
とりあえず…下記の様に変えました。 CookieContainer cc = new CookieContainer(); cc.SetCookies(webBrowser1.Url,webBrowser1.Document.Cookie.Replace(";" , ",")); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(cookieが必要なURL); req.CookieContainer = cc; HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st); textBox1.Text = sr.ReadToEnd(); sr.Close(); st.Close(); 試しに、 webBrowser1.Url と webBrowser1.Document.Cookie.Replace(";" , ",") は個別に取得した所、無事取得出来ておりました。 …で…迷い込みました。
- Wr5
- ベストアンサー率53% (2173/4061)
で、検索してみたら http://www.atmarkit.co.jp/fdotnet/dotnettips/326cookie/cookie.html なんてのを見つけました。 webBrowser1.Document.Cookieから…ではありませんが。 CookieContainer.Add()で追加する際にURIが必要かも知れません。 # 上記の例だと…リクエスト発行した後(というかレスポンス受けた時)にURIと紐づけてコンテナに記録される……のでしょう。たぶん。
お礼
先にして頂いた回答と共に、こちらの内容も良く確認させていただきます。 引き続き、迷い込んでしまいましたら、ご助力をお願い致します。
補足
迷い込みました…ご指摘の通り、.Addの時のuriです。 今の所、回答して頂いた内容から、button1の押下で、 Cookie cookie = new Cookie(); cookie.Value = webBrowser1.Document.Cookie; CookieContainer cc = new CookieContainer(); // cc.Add(cookie); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(cookieが必要なURL); // req.CookieContainer = cc; HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st); textBox1.Text = sr.ReadToEnd(); sr.Close(); st.Close(); この様な内容でtextbox1にhtmlの内容を表示させようとしておりますが、cookieを反映させなければセッションタイムアウトが表示されております。 //を取るとcc.Add(cookie);で強制終了します。 uriがそもそも何なのか理解に乏しい状態であり、必要なhtmlのソースからencodeURIComponent($('comment_str').value)との文字列がありましたが、どう反映させれば良いかわかりません。 更なるご教授を頂けませんでしょうか。
- Wr5
- ベストアンサー率53% (2173/4061)
使ったコトはないので、正しいかは微妙ですが……。 # キーワードでWeb検索して確認して下さい。どこかにサンプルもありそうですが。 >取得したcookieをそのままwebrequestに設定しようとすると、 >string型ではダメと言われてしまいます。 cookieクラスのインスタンスを作成して、取得したcookieのstring型データをcookieクラスのValueに設定しておきます。 CookieContainerクラスのインスタンスを作成して、Addメソッドで先ほど作成したcookieクラスのインスタンスをコンテナに追加します。 CookieContainerクラスのインスタンスをHttpWebRequestクラスのインスタンスのCookieContainerプロパティに設定します。 ……HttpWebRequestクラスのインスタンスを作成して、CookieContainerプロパティがnullでなければ、そのままAddメソッドでcookieクラスを追加…とかできるかも知れませんね。 # WebRequestクラスだとcookie扱うモノが無いような気がしますけど、その辺りはどうなんでしょう???
お礼
素早い回答、いつも本当に助かります。 今リンク先等色々見ております。 まだ解決には至っておりませんが、なんか進んだ様な気がします。
お礼
色々教えて頂き、本当に助かっております。 同時に、余りのハードルの高さに困惑しております。 ・「HTTP セッション管理」について、引き続き調べて行きます。読んでると吐きそうになりますが…。 ・「cookieを受け入れない」にした場合、あっさり「セッションタイムアウト」となり、弾き出されます。 本当に踏み入れてはいけない領域に来てしまった気分ですが…ココまで助けて頂いて長期戦になりそうで申し訳ないです。引き続き、頭をクリアにして進めますので、宜しくお願い致します。