C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ローカルに保存されているCookieを、VB.NETで取得


(過去ログ 123 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■73484 / inTopicNo.1)  ローカルに保存されているCookieを、VB.NETで取得
  
□投稿者/ キャンチョメ (1回)-(2014/10/01(Wed) 11:39:17)

分類:[VB.NET/VB2005 以降] 

2014/10/01(Wed) 11:45:18 編集(投稿者)

VB2005を使用しています。IE8を使用しています。

@http://msdn.microsoft.com/ja-jp/library/cc719213.aspx
 を参考にASP.NETのプロジェクトを作成し、
ユーザー名とニックネームをCookieに記憶してみました。
このCookieの値をVB.NET(ASP.NETではありません)で取得したい。

AVB.NET 記述抜粋
Public Declare Function InternetGetCookie Lib "wininet.dll" Alias "InternetGetCookieA" _
(ByVal lpszUrlName As String, ByVal lpszCookieName As String, _
ByVal lpszCookieData As StringBuilder, _
ByRef lpdwSize As Long) As Boolean

Private Function getCookie(ByVal szUrlName As String) As String
Dim sCookieVal As New StringBuilder(4096)
Dim lpLength As Long
Dim bRet As Boolean
lpLength = sCookieVal.Capacity
bRet = InternetGetCookie(szUrlName, vbNull, sCookieVal, lpLength)
If bRet = True Then Return sCookieVal.ToString
Return ""
End Function

Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'URLはhttp://msdn.microsoft.com/ja-jp/library/cc719213.aspxを元に作成したViewCookie.aspx のアドレス
MsgBox(getCookie("http://localhost:55555/ViewCookie.aspx"))
End Sub


を実行しても、getCookieのInternetGetCookieはFalseが返ってきてしまう。
@のASP.NETのプロジェクトを発行して、サーバーにおいてみてもダメでした。
(URLはIISでのパスにしました)

宜しくお願いします

引用返信 編集キー/
■73485 / inTopicNo.2)  Re[1]: ローカルに保存されているCookieを、VB.NETで取得
□投稿者/ 魔界の仮面弁士 (131回)-(2014/10/01(Wed) 12:19:31)
No73484 (キャンチョメ さん) に返信
> Public Declare Function InternetGetCookie Lib "wininet.dll" Alias "InternetGetCookieA" _
> (ByVal lpszUrlName As String, ByVal lpszCookieName As String, _
> ByVal lpszCookieData As StringBuilder, _
> ByRef lpdwSize As Long) As Boolean

・〜A 系の API は Win9x 時代の名残です。NT 系および現行 OS でも利用はできますが、
 Declare Unicode Function などにて、〜W 系を利用するのが望ましいでしょう。

・最後の引数 lpdwSize のデータ型は LPDWORD です。
 これは VB 的には「ByRef UInt32」や「ByVal IntPtr」に相当しますが、
 現在の定義は「ByRef Int64」になっており、定義が間違っています。
引用返信 編集キー/
■73487 / inTopicNo.3)  Re[1]: ローカルに保存されているCookieを、VB.NETで取得
□投稿者/ WebSurfer (355回)-(2014/10/01(Wed) 13:53:11)
No73484 (キャンチョメ さん) に返信

InternetGetCookieEx メソッド単独では、先に受信済みで HDD に保存されていて
有効期限切れでない Cookie 以外は取得できません。

新たな要求に対して Web サイトから送信されてきた Cookie は、meta タグに設定
されたものも含め、WebBrowser を動かしておけば取得できます。

以下のページような感じです。

WebBrowser で HttpOnly 属性の Cookie 取得
http://surferonwww.info/BlogEngine/post/2012/08/13/how-to-get-cookies-with-httponly-attribute-in-webbrowser.aspx

WebBrowser の表示が不要なら Visible プロパティを false に設定しておけばいい
です。

InternetGetCookieEx メソッドなどは使わなくても(WebBrowser も使わないで)
HttpWebRequest, HttpWebResponse, CookieContainer クラスを使って Cookie の
送受信は可能です。HttpOnly 属性の Cookie も取得できます。ただし meta タグ
に設定された Cookie は取得できませんが。

以下のような感じです。textBox1.Text には URL が入ってます。

private void button2_Click(object sender, EventArgs e)
{
    System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(textBox1.Text);
    request.CookieContainer = new System.Net.CookieContainer();
    request.CookieContainer.SetCookies(new Uri(textBox1.Text), "test=ThisIsTestCookie"); 

    System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();

    string cookies = "";
    foreach (System.Net.Cookie cookie in response.Cookies)
    {
        cookies += String.Format("{0}={1} ", cookie.Name, cookie.Value);
    }
    label1.Text = cookies;  // HttpOnly 属性の Cookie を含めすべて取得できる。
}

引用返信 編集キー/
■73491 / inTopicNo.4)  Re[1]: ローカルに保存されているCookieを、VB.NETで取得
□投稿者/ WebSurfer (356回)-(2014/10/01(Wed) 15:10:46)
No73484 (キャンチョメ さん) に返信

【追伸】

質問者さんが使っているメソッドは InternetGetCookieEx ではなくて
InternetGetCookie でしたね。すみません見落としてました。

InternetGetCookie メソッドを使ってうまく行くかどうかは試してない
ので分かりません。ただ、MSDN ライブラリによると HttpOnly 属性の付
いた Cookie は取得できないのは間違いなさそうです。
引用返信 編集キー/
■73492 / inTopicNo.5)  Re[2]: ローカルに保存されているCookieを、VB.NETで取得
□投稿者/ キャンチョメ (2回)-(2014/10/01(Wed) 15:34:27)
2014/10/01(Wed) 16:44:02 編集(投稿者)

魔界の仮面弁士 様
ご教授ありがとうございました。

WebSurfer様
ご教授ありがとうございました。

@http://msdn.microsoft.com/ja-jp/library/cc719213.aspx
では有効期限がセットされていないようでしたので

Response.Cookies("USERNAME").Expires = DateTime.Now.AddDays(1)
Response.Cookies("NICKNAME").Expires = DateTime.Now.AddDays(1)

で有効期限をセットしてみました。
そうすると、InternetGetCookieでTrueを返してきましたが
sCookieVal.ToStringは、USERNAME; NICKNAME
でした。

>新たな要求に対して Web サイトから送信されてきた Cookie は、meta タグに設定
>されたものも含め、WebBrowser を動かしておけば取得できます。
っという事は@のように事前に実行中のCookieは取得できないという事でしょうか?

お手数ですが、ご教授頂けますよう宜しくお願いします。
引用返信 編集キー/
■73493 / inTopicNo.6)  Re[3]: ローカルに保存されているCookieを、VB.NETで取得
□投稿者/ WebSurfer (357回)-(2014/10/01(Wed) 16:18:02)
No73492 (キャンチョメ さん) に返信

> sCookieVal.ToStringは、USERNAME; NICKNAMEでした。

それは納得の結果ですよね? 名前しか取得できないのは Value が設定されてな
いからだと思いますが。


> @のように事前に実行中のCookieは取得できないという事でしょうか?

@ の記事はブラウザ (IE) を操作してCookie を送受信していることは理解してい
ますか?  InternetGetCookie メソッドではありません。

そして、有効期限(もちろん将来日時の)が設定されてない Cookie はブラウザの
メモリにしか保持されないということをご存知でしょうか?

有効期限(もちろん将来日時の)が設定されている Cookie は HDD に保存されます
ので InternetGetCookie メソッド単独で取得できます。

しかし、ブラウザ (IE) のメモリにしか保持されない Cookie は、IE が動いてない
と存在しないのですから、何をどうやっても取得できないです。


質問者さんは Cookie についてあまり詳しくないようですが、もしそうであれば以
下のページに目を通すことをお勧めします。

ASP.NET の Cookie の概要
http://msdn.microsoft.com/ja-jp/library/ms178194.aspx

Cookie に有効期限を設定しないとどうなるかは、上記のページの「Cookie の書き
込み」のセクションに書いてあります。

引用返信 編集キー/
■73495 / inTopicNo.7)  Re[2]: ローカルに保存されているCookieを、VB.NETで取得
□投稿者/ キャンチョメ (4回)-(2014/10/01(Wed) 16:43:41)
WebSurfer様
ご教授ありがとうございました。

http://msdn.microsoft.com/ja-jp/library/ms178194.aspx
を確認してみたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -