HttpWebRequest передает учетные данные следующему HttpWebRequest - PullRequest
2 голосов
/ 26 марта 2011

Я захожу на страницу с помощью HttpWebRequest и получаю некоторую информацию.Затем я использую эту информацию для создания нового запроса HttpWebRequest, чтобы получить дополнительную информацию.Я не хочу использовать WebClient.

Как передать учетные данные, полученные при входе в систему с использованием первого запроса HttpWebRequest, во второй?

РЕДАКТИРОВАТЬ: если я использую коллекцию Cookie, тогдавозвращаться как пустой.Я только что попытался использовать WebClient в качестве крайней меры, и даже из-за того, что он не работает, второй запрос возвращает меня к экрану входа в систему.Я заметил, что в WebBrowser есть cookie.

Ответы [ 3 ]

6 голосов
/ 26 марта 2011

Добавьте CookieContainer к каждому запросу перед его отправкой. Добавьте куки, которые вы получаете от первого ответа на второй запрос. Предполагая, что они используют куки для аутентификации, это должно аутентифицировать второй запрос.

 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 голосов
/ 23 апреля 2014

это всего лишь пример работающего кода, основанного на ответе 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();
0 голосов
/ 16 января 2014

Это действительно старый вопрос, и я знаю, что в нем нет 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...