您可以 PInvoke GetInternetCookie 以获取 ASPNET 会话 cookie。
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern bool InternetGetCookie(
string url,
string name,
StringBuilder cookieData,
ref int length);
然后您可以手动构建一个 HttpWebRequest 并将 ASPNET 会话 cookie 添加到您的请求对象上的 CookieContainer 中。可能有一种方法可以将 cookie 添加到由 WebClient 创建的底层 WebRequest,如果是这样,您可以使用它来代替。
希望这可以帮助。
编辑:
基本上这里是我在 HttpWebRequest 上使用的代码,用于在 IE cookie 缓存中设置 cookie。不幸的是,我没有任何代码可以在此处读取缓存中的 cookie。
基本上,您想要做的是对该代码进行一些派生,并使用 InteretGetCookie 使用您网站域中的 cookie 创建您的 CookieCollection 对象。您必须手动解析这些。然后在您的 HttpWebRequest 上,您可以使用 InternetGetCookie 从域中读取的 cookie,并将它们传递到您创建的 CookieContainer 中。
public class HttpWebConnection
{
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern bool InternetSetCookie(
string url,
string name,
string cookieData);
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern bool InternetGetCookie(
string url,
string name,
StringBuilder cookieData,
ref int length);
public HttpWebConnection()
{
Cookies = new CookieContainer();
AutoRedirect = false;
}
public HttpWebConnection(string baseAddress)
: this()
{
BaseAddress = baseAddress;
BaseUri = new Uri(BaseAddress);
}
public bool AutoRedirect { get; set; }
public Uri BaseUri { get; private set; }
public string BaseAddress { get; private set; }
public CookieContainer Cookies { get; private set; }
public virtual HttpWebResponse Send(string method, Uri uri)
{
return Send(method, uri, null, false);
}
public virtual HttpWebResponse Send(string method, Uri uri, string post, bool authenticating)
{
Uri absoluteUri = null;
if (uri.IsAbsoluteUri)
{
absoluteUri = uri;
}
else
{
absoluteUri = new Uri(BaseUri, uri);
}
HttpWebRequest request = WebRequest.Create(absoluteUri) as HttpWebRequest;
request.CookieContainer = Cookies;
request.Method = method;
if (method == "POST")
{
request.ContentType = "application/x-www-form-urlencoded";
}
request.AllowAutoRedirect = false;
if (!string.IsNullOrEmpty(post))
{
Stream requestStream = request.GetRequestStream();
byte[] buffer = Encoding.UTF8.GetBytes(post);
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Close();
}
HttpWebResponse response = null;
response = request.GetResponse() as HttpWebResponse;
foreach (Cookie cookie in response.Cookies)
{
bool result = InternetSetCookie(BaseAddress, cookie.Name, cookie.Value);
if (!result)
{
int errorNumber = Marshal.GetLastWin32Error();
}
}
if (AutoRedirect && (response.StatusCode == HttpStatusCode.SeeOther
|| response.StatusCode == HttpStatusCode.RedirectMethod
|| response.StatusCode == HttpStatusCode.RedirectKeepVerb
|| response.StatusCode == HttpStatusCode.Redirect
|| response.StatusCode == HttpStatusCode.Moved
|| response.StatusCode == HttpStatusCode.MovedPermanently))
{
string uriString = response.Headers[HttpResponseHeader.Location];
Uri locationUri;
//TODO investigate if there is a better way to detect for a relative vs. absolute uri.
if (uriString.StartsWith("HTTP", StringComparison.OrdinalIgnoreCase))
{
locationUri = new Uri(uriString);
}
else
{
locationUri = new Uri(this.BaseUri, new Uri(uriString));
}
response = Send("GET", locationUri);
}
return response;
}
}