HttpWebRequest将凭据传递给下一个HttpWebRequest

我正在使用HttpWebRequest登录页面并获取一些信息。 然后我使用该信息创建一个新的HttpWebRequest以获取更多信息。 我不想使用WebClient。

如何将使用第一个HttpWebRequest登录时获得的凭据传递给第二个?

编辑:如果我使用CookieCollection,那么这将是空的。 我只是尝试使用WebClient作为最后的手段,即使它没有工作,第二个请求将我带回登录屏幕。 我注意到在WebBrowser中有一个cookie。

在发送之前为每个请求添加CookieContainer 。 将第一个响应中获得的cookie添加到第二个请求中。 假设他们使用cookie进行身份validation,这应该validation第二个请求。

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; ... 

这只是基于答案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(); 

这是一个非常古老的问题,我知道它没有说明WebClient但我会在这里发布给所有来自Google的人。 原始概念不是我的代码。 我不知道我最初在哪里找到它。

 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; } }