å¨åæ°æ®ééæ¶ï¼æäºç½ç«éè¦è¾å ¥éªè¯ç ï¼ä½åç½ç«éªè¯ç é½ä¸åï¼ä¸å¯è½æå®ç¾çè¯å«éªè¯ç ç代ç ï¼æ以æä¹æ²¡å»ç 究ï¼ææéåçæ¹æ¡æ¯ï¼å¨winformééè¿WebBrowserè°ç¨ç½é¡µå æå¨ç»å½ç³»ç»ï¼ç¶ååéè¿webBrowser1.Document.Cookieè·åå ¶Cookieï¼åå°å ¶ç¨å°HttpWebRequestéç¨æ¥è®¿é®èªå·±éè¦ç页ã
ä¸ç´ç¨çé½æ²¡æé®é¢ï¼ä½æè¿å¨å¯¹ä¸ä¸ªç½ç«æä½æ¶æ»æ¯ä¸è½è·åå®æ´Cookieï¼ç¾æä¸å¾å ¶è§£ï¼ä½¿ç¨Fiddler2对æ¯åç°ï¼ä¸è½è·åå°çCookieéæåæä¸ä¸ªHttpOnlyçæ è¯ï¼é¡ºè¤æ¸çåç°åæ¥webBrowser1.Document.Cookieéæ¯åä¸å°HttpOnlyçCookieçï¼ä¹æ¾å°è§£å³æ¹æ³ï¼
using System;
using System.ComponentModel;
using System.Net;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
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></SUMMARY>
/// åå¾WebBrowserçå®æ´Cookieã
/// å 为é»è®¤çwebBrowser1.Document.Cookieåä¸å°HttpOnlyçCookie
///
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();
}
}
 å¯è½æç¨çèµæï¼
Retrieve HttpOnly Session Cookie in WebBrowser
C#ä¸å©ç¨WebBrowserå®æ´è·åCOOKIE