请参考我下面的评论。
以下是我所做的事情,并且它有效(来源)。
首先添加这个类:
namespace System.Net
{
using System.Collections.Specialized;
using System.Linq;
using System.Text;
public class CookieAwareWebClient : WebClient
{
public void Login(string loginPageAddress, NameValueCollection loginData)
{
CookieContainer container;
var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
var query = string.Join("&",
loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));
var buffer = Encoding.ASCII.GetBytes(query);
request.ContentLength = buffer.Length;
var requestStream = request.GetRequestStream();
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Close();
container = request.CookieContainer = new CookieContainer();
var response = request.GetResponse();
response.Close();
CookieContainer = container;
}
public CookieAwareWebClient(CookieContainer container)
{
CookieContainer = container;
}
public CookieAwareWebClient()
: this(new CookieContainer())
{ }
public CookieContainer CookieContainer { get; private set; }
protected override WebRequest GetWebRequest(Uri address)
{
var request = (HttpWebRequest)base.GetWebRequest(address);
request.CookieContainer = CookieContainer;
return request;
}
}
}
使用方法:
public static void Main()
{
var loginAddress = "www.mywebsite.com/login";
var loginData = new NameValueCollection
{
{ "username", "shimmy" },
{ "password", "mypassword" }
};
var client = new CookieAwareWebClient();
client.Login(loginAddress, loginData);
}
FormUrlEncodedContent
然后使用ReadAsStringAsync
。不管怎样,这个答案在发布时是好的,我建议使用HttpClient
,提供一个覆盖SendAsync
以登录的DelegatingHandler
。我希望有时间更新这个答案。 - Shimmy WeitzhandlerHTTP是无状态的。因此,您无法使WebClient永久登录。在HTTP中不存在会话的概念。服务器端技术(如ASP.NET)通过使用cookie或查询字符串参数来模拟具有状态的行为,从而实现会话的概念,并在每个请求中来回发送。话虽如此,您可以从WebClient模拟浏览器的操作。如果您可以访问该网站,请使用正确的凭据连接到它并使用Fiddler捕获流量。然后,确保WebClient发送正确的cookie、请求头、查询字符串等,与浏览器完全相同。