我使用HttpWebRequest登录页面并获取一些信息。然后,我使用该信息创建一个新的HttpWebRequest以获取更多信息。我不想使用WebClient。
如何将使用第一个HttpWebRequest登录时获得的凭据传递给第二个?
编辑:如果我使用CookieCollection,那么这将变为空。我只是尝试使用WebClient作为最后的手段,即使它不起作用,第二个请求将我带回登录屏幕。我注意到在WebBrowser中有一个cookie。
答案 0 :(得分:6)
在发送之前为每个请求添加CookieContainer。将第一个响应中获得的cookie添加到第二个请求中。假设他们使用cookie进行身份验证,这应该验证第二个请求。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlWithParameters);
request.CookieContainer = new CookieContainer();
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
var cookies = new CookieContainer();
cookies.Add( response.Cookies );
request = (HttpWebRequest)WebRequest.Create(secondUrlWithParameters);
request.CookieContainer = cookies;
...
答案 1 :(得分:2)
这只是基于答案2运行代码的示例。也许是多余的可能会说明某人。
string url = "http://servername/place-where-data-is.extension"
string loginUrl = "https://servername/sampleLogin?email=eeeeee&passwd=xxxxxxx";
HttpWebRequest loginRequest = (HttpWebRequest)HttpWebRequest.Create(loginUrl);
loginRequest.CookieContainer = new CookieContainer();
loginRequest.Method = WebRequestMethods.Http.Get;
HttpWebResponse loginResponse = (HttpWebResponse)loginRequest.GetResponse();
var cookies = new CookieContainer();
cookies.Add(loginResponse.Cookies);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.CookieContainer = cookies;
request.Method = WebRequestMethods.Http.Get;
WebResponse response = (WebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
答案 2 :(得分:0)
这是一个非常古老的问题,我知道它没有说明WebClient
但是我会在这里发布给所有来自谷歌的人。原始概念不是我的代码。我不知道我最初在哪里找到它。
using (WebClientEx client = new WebClientEx())
{
client.IntTimeout = intTimeout;
client.DownloadString(strReportUrlPrefix + strReportUrlQuery);
NameValueCollection auth = new NameValueCollection
{
{ "j_username", strReportUsername},
{ "j_password", strReportPassword}
};
byte[] data = client.UploadValues(strReportUrlPrefix + "j_security_check", auth);
// LOGIC HERE WITH DATA
}
WebClientEx
上课:
public class WebClientEx : WebClient
{
private CookieContainer _cookieContainer = new CookieContainer();
public int IntTimeout { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request != null)
request.Timeout = IntTimeout;
if (request is HttpWebRequest)
(request as HttpWebRequest).CookieContainer = _cookieContainer;
return request;
}
}