自定义带cookie的WebBrowser

1、由于自带的webbrowser不带cookie 请求需要用到cookie,则封装该类如下:    

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Web;

public class AutoBrowser : System.Windows.Forms.WebBrowser

    {
        #region Cookie
        /// <summary>
        ///     设置Cookie
        /// </summary>
        public void SetCookie(string url, string cookie)
        {
            foreach (string c in cookie.Split(';'))
            {
                string[] item = c.Split('=');
                if (item.Length == 2)
                {
                    InternetSetCookie(url, null, new Cookie(HttpUtility.UrlEncode(item[0]).Replace("+", ""), HttpUtility.UrlEncode(item[1]), "; expires = Session GMT", "/").ToString());
                }
            }
        }


        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);


        #endregion

    }

调用:

 this.webBrowser.SetCookie(url, cookie);

 this.webBrowser.Navigate(url);


2、取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 FuanClient.Utils
{
    internal sealed class NativeMethods
    {
        #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
    }




    /// <SUMMARY>
    /// 取得WebBrowser的完整Cookie。<br/>
    /// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie    
    /// </SUMMARY>     
    public class FullWebBrowserCookie
    {


        [SecurityCritical]
        public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)
        {
            uint pchCookieData = 0;
            string url = UriToString(uri);
            uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;


            //Gets the size of the string builder     
            if (NativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))
            {
                pchCookieData++;
                StringBuilder cookieData = new StringBuilder((int)pchCookieData);


                //Read the cookie     
                if (NativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))
                {
                    DemandWebPermission(uri);
                    return cookieData.ToString();
                }
            }


            int lastErrorCode = Marshal.GetLastWin32Error();


            if (throwIfNoCookie || (lastErrorCode != (int)NativeMethods.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();
        }
    }


}



3、获取cookie调用

 var httpCookieInternal = FullWebBrowserCookie.GetCookieInternal(new Uri(dictionaryElementSelector[EnumStep.登陆.ToString()]), false);

猜你喜欢

转载自blog.csdn.net/vs920079469vs/article/details/79584229