.net 获取浏览器Cookie(包括HttpOnly)实例分享
.net 获取浏览器Cookie(包括HttpOnly)实例分享
发布时间:2016-12-29 来源:查字典编辑
摘要:一、接口文件复制代码代码如下:usingSystem;usingSystem.ComponentModel;usingSystem.Net;...

一、接口文件

复制代码 代码如下:

using System;

using System.ComponentModel;

using System.Net;

using System.Runtime.InteropServices;

using System.Security;

using System.Security.Permissions;

using System.Text;

namespace CookieHandler

{

internal sealed class INativeMethods

{

#region enums

public enum ErrorFlags

{

ERROR_INSUFFICIENT_BUFFER = 122,

ERROR_INVALID_PARAMETER = 87,

ERROR_NO_MORE_ITEMS = 259

}

public enum InternetFlags

{

INTERNET_COOKIE_HTTPONLY = 8192, //Requires IE 8 or higher

INTERNET_COOKIE_THIRD_PARTY = 131072,

INTERNET_FLAG_RESTRICTED_ZONE = 16

}

#endregion

#region DLL Imports

[SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]

internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved);

#endregion

}

}

二、获取cookie类

复制代码 代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Net;

using System.Runtime.InteropServices;

using System.Security;

using System.Security.Permissions;

using System.Text;

namespace CookieHandler

{

/// <SUMMARY></SUMMARY>

/// 取得WebBrowser的完整Cookie。

/// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie

/// IE7不兼容,IE8可以,其它未知

///

public class FullWebBrowserCookie

{

public static Dictionary<string, string> GetCookieList(Uri uri, bool throwIfNoCookie)

{

Dictionary<string, string> dict = new Dictionary<string, string>();

string cookie = GetCookieInternal(uri, throwIfNoCookie);

Console.WriteLine("FullWebBrowserCookie - 所有cookie:" + cookie);

string[] arrCookie = cookie.Split(';');

foreach (var item in arrCookie)

{

string[] arr = item.Split('=');

string key = arr[0].Trim();

string val = "";

if (arr.Length >= 2)

{

val = arr[1].Trim();

}

if (!dict.ContainsKey(key))

{

dict.Add(key, val);

}

}

Console.WriteLine("FullWebBrowserCookie - cookie已载入dict,共" + dict.Count.ToString() + "项");

return dict;

}

public static string GetCookieValue(string key, Uri uri, bool throwIfNoCookie)

{

Console.WriteLine("GetCookieValue");

Dictionary<string, string> dict = GetCookieList(uri, throwIfNoCookie);

if (dict.ContainsKey(key))

{

return dict[key];

}

return "";

}

[SecurityCritical]

public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)

{

Console.WriteLine("GetCookieInternal");

uint pchCookieData = 0;

string url = UriToString(uri);

uint flag = (uint)INativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;

//Gets the size of the string builder

if (INativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))

{

pchCookieData++;

StringBuilder cookieData = new StringBuilder((int)pchCookieData);

//Read the cookie

if (INativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))

{

DemandWebPermission(uri);

return cookieData.ToString();

}

}

int lastErrorCode = Marshal.GetLastWin32Error();

if (throwIfNoCookie || (lastErrorCode != (int)INativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS))

{

throw new Win32Exception(lastErrorCode);

}

return null;

}

private static void DemandWebPermission(Uri uri)

{

string uriString = UriToString(uri);

if (uri.IsFile)

{

string localPath = uri.LocalPath;

new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand();

}

else

{

new WebPermission(NetworkAccess.Connect, uriString).Demand();

}

}

private static string UriToString(Uri uri)

{

if (uri == null)

{

throw new ArgumentNullException("uri");

}

UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString);

return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), 2083).ToString();

}

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类