HttpWebRequest将凭据传递给下一个HttpWebRequest

时间:2011-03-26 16:32:06

标签: c# .net login httpwebrequest credentials

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

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

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

3 个答案:

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