.net 获取浏览器Cookie(包括HttpOnly)
网上好不容易找到的,分享+收藏
一、接口文件
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(); } } }