C# 尝试使用HttpWebRequest获取身份验证cookie
我必须从一个安全的站点上抓取一个表,我登录到页面并检索身份验证令牌和任何其他相关cookie时遇到问题。我做错什么了吗C# 尝试使用HttpWebRequest获取身份验证cookie,c#,httpwebrequest,screen-scraping,webclient,httpwebresponse,C#,Httpwebrequest,Screen Scraping,Webclient,Httpwebresponse,我必须从一个安全的站点上抓取一个表,我登录到页面并检索身份验证令牌和任何其他相关cookie时遇到问题。我做错什么了吗 public NameValueCollection LoginToDatrose() { var loginUriBuilder = new UriBuilder(); loginUriBuilder.Host = DatroseHostName; loginUriBuilder.Path = BuildURIPath(DatroseBasePath,
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder = new UriBuilder();
loginUriBuilder.Host = DatroseHostName;
loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE);
loginUriBuilder.Scheme = "https";
var boundary = Guid.NewGuid().ToString();
var postData = new NameValueCollection();
postData.Add("LoginName", DatroseUserName);
postData.Add("Password", DatrosePassword);
var data = Encoding.ASCII.GetBytes(postData.ToQueryString(false));
var request = WebRequest.Create(loginUriBuilder.Uri) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var d = request.GetRequestStream())
{
d.Write(data, 0, data.Length);
}
var response = request.GetResponse() as HttpWebResponse;
var responseCookies = new NameValueCollection();
foreach (var nvp in response.Cookies.OfType<Cookie>())
{
responseCookies.Add(nvp.Name, nvp.Value);
}
//using (var responseData = response.GetResponseStream())
//using (var responseReader = new StreamReader(responseData))
//{
// var theResponse = responseReader.ReadToEnd();
// Debug.WriteLine(theResponse);
//}
return responseCookies;
}
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder=new UriBuilder();
loginUriBuilder.Host=DatroseHostName;
loginUriBuilder.Path=BuildURIPath(DatroseBasePath,登录页面);
loginulibuilder.Scheme=“https”;
var boundary=Guid.NewGuid().ToString();
var postData=new NameValueCollection();
添加(“LoginName”,DatroseUserName);
添加(“密码”,DatrosePassword);
var data=Encoding.ASCII.GetBytes(postData.ToQueryString(false));
var request=WebRequest.Create(loginuribilder.Uri)作为HttpWebRequest;
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=data.Length;
使用(var d=request.GetRequestStream())
{
d、 写入(数据,0,数据长度);
}
var response=request.GetResponse()作为HttpWebResponse;
var responseCookies=新名称valuecollection();
foreach(响应中的var nvp.Cookies.OfType())
{
添加(nvp.Name,nvp.Value);
}
//使用(var responseData=response.GetResponseStream())
//使用(var responseReader=新的StreamReader(responseData))
//{
//var theResponse=responseReader.ReadToEnd();
//Debug.WriteLine(响应);
//}
返回应答书;
}
我在返回对象中没有得到任何值。它不会失败。theResponse
(未注释时)的值似乎是登录页面的HTML
非常感谢您的帮助。好的,这里的问题似乎与传递凭据后发生的302重定向有关。
HttpWebRequest
将自动跟随302
最终,我做的事情有点不同。首先,我将WebClient
类划分为以下子类:
public class CookiesAwareWebClient : WebClient
{
private CookieContainer outboundCookies = new CookieContainer();
private CookieCollection inboundCookies = new CookieCollection();
public CookieContainer OutboundCookies
{
get
{
return outboundCookies;
}
}
public CookieCollection InboundCookies
{
get
{
return inboundCookies;
}
}
public bool IgnoreRedirects { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = outboundCookies;
(request as HttpWebRequest).AllowAutoRedirect = !IgnoreRedirects;
}
return request;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
if (response is HttpWebResponse)
{
inboundCookies = (response as HttpWebResponse).Cookies ?? inboundCookies;
}
return response;
}
}
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder = new UriBuilder();
loginUriBuilder.Host = DatroseHostName;
loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE);
loginUriBuilder.Scheme = "https";
var postData = new NameValueCollection();
postData.Add("LoginName", DatroseUserName);
postData.Add("Password", DatrosePassword);
var responseCookies = new NameValueCollection();
using (var client = new CookiesAwareWebClient())
{
client.IgnoreRedirects = true;
var clientResponse = client.UploadValues(loginUriBuilder.Uri, "POST", postData);
foreach (var nvp in client.InboundCookies.OfType<Cookie>())
{
responseCookies.Add(nvp.Name, nvp.Value);
}
}
return responseCookies;
}
这允许我使用一个能够识别cookies的WebClient
类,以及一个我可以控制重定向的类。然后我重新编写了登录代码,如下所示:
public class CookiesAwareWebClient : WebClient
{
private CookieContainer outboundCookies = new CookieContainer();
private CookieCollection inboundCookies = new CookieCollection();
public CookieContainer OutboundCookies
{
get
{
return outboundCookies;
}
}
public CookieCollection InboundCookies
{
get
{
return inboundCookies;
}
}
public bool IgnoreRedirects { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = outboundCookies;
(request as HttpWebRequest).AllowAutoRedirect = !IgnoreRedirects;
}
return request;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
if (response is HttpWebResponse)
{
inboundCookies = (response as HttpWebResponse).Cookies ?? inboundCookies;
}
return response;
}
}
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder = new UriBuilder();
loginUriBuilder.Host = DatroseHostName;
loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE);
loginUriBuilder.Scheme = "https";
var postData = new NameValueCollection();
postData.Add("LoginName", DatroseUserName);
postData.Add("Password", DatrosePassword);
var responseCookies = new NameValueCollection();
using (var client = new CookiesAwareWebClient())
{
client.IgnoreRedirects = true;
var clientResponse = client.UploadValues(loginUriBuilder.Uri, "POST", postData);
foreach (var nvp in client.InboundCookies.OfType<Cookie>())
{
responseCookies.Add(nvp.Name, nvp.Value);
}
}
return responseCookies;
}
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder=new UriBuilder();
loginUriBuilder.Host=DatroseHostName;
loginUriBuilder.Path=BuildURIPath(DatroseBasePath,登录页面);
loginulibuilder.Scheme=“https”;
var postData=new NameValueCollection();
添加(“LoginName”,DatroseUserName);
添加(“密码”,DatrosePassword);
var responseCookies=新名称valuecollection();
使用(var client=new CookiesAwareWebClient())
{
client.IgnoreRedirects=true;
var clientResponse=client.UploadValues(loginuribilder.Uri,“POST”,postData);
foreach(client.InboundCookies.OfType()中的var nvp)
{
添加(nvp.Name,nvp.Value);
}
}
返回应答书;
}
…一切都很顺利。您可以在httpwebrequest具有AllowDirect属性的地方使用它。你可以设置错误;