2010-11-11 1 views
9

У меня есть приложение winforms, над которым я работал, он запускает несколько тестов для учетных записей пользователей. Для выполнения тестов требуется один раз для входа в систему.C# WebRequest с использованием файлов cookie

string paramaters = "authmethod=on&chkRememberMe=on&login-form-type=pwd&password=" + pw.Text + "&userid=" + uid.Text + "&username=" + uid.Text; 
     string strResponse; 
     HttpWebRequest requestLogin = (HttpWebRequest)WebRequest.Create("https://www.url.com/login.form"); 
     requestLogin.Method = "POST"; 
     requestLogin.CookieContainer = cookieJar; 
     requestLogin.ContentType = "application/x-www-form-urlencoded"; 

     requestLogin.ContentLength = paramaters.Length; 
     StreamWriter stOut = new StreamWriter(requestLogin.GetRequestStream(), System.Text.Encoding.ASCII); 
     stOut.Write(paramaters); 
     stOut.Close(); 

     StreamReader stIn = new StreamReader(requestLogin.GetResponse().GetResponseStream()); 
     strResponse = stIn.ReadToEnd(); 
     stIn.Close(); 

Этот скрипт работает для входа в систему просто отлично, проблема, когда мне нужно на самом деле запустить тесты мне нужно, чтобы вернуть все результаты в виде строки (результаты HTML).

private string runTestRequest(Uri url, string parameters) 
    { 
     string testResults = string.Empty; 
     HttpWebRequest runTest = (HttpWebRequest)WebRequest.Create(url); 
     runTest.CookieContainer = cookieJar; 
     runTest.Method = "POST"; 
     runTest.ContentType = "application/x-www-form-urlencoded"; 
     StreamWriter stOut = new StreamWriter(runTest.GetRequestStream(), System.Text.Encoding.ASCII); 
     stOut.Write(parameters); 
     stOut.Close(); 
     StreamReader stIn = new StreamReader(runTest.GetResponse().GetResponseStream()); 
     testResults = stIn.ReadToEnd(); 
     stIn.Close(); 
     return testResults; 
    } 

Но он идет и пытается войти. Как я могу использовать Cookie из предыдущего запроса на вход с этим + многими другими веб-запросами?

Спасибо за помощь.

EDIT:

Я добавил это в мой код еще, который должен сделать то же самое, как BrokenGlass говорит, за исключением лишь немного отличается, но все еще не работает.

foreach (Cookie cookie in responseLogin.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      richTextBox2.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 
+0

вы проверили, что в cookieJar при запуске нового запроса? содержит ли что-нибудь? – Artemiy

+0

Я сделал MessageBox.Show (cookieJar.Count.ToString()); и он показал, что счет 2 – Alex

ответ

21

Что-то, как это должно работать, я использую подобный код, чтобы сохранить логин печенье:

HttpWebRequest runTest; 
//...do login request 
//get cookies from response 

CookieContainer myContainer = new CookieContainer(); 
for (int i = 0; i < Response.Cookies.Count; i++) 
{ 
    HttpCookie http_cookie = Request.Cookies[i]; 
    Cookie cookie = new Cookie(http_cookie.Name, http_cookie.Value, http_cookie.Path); 
    myContainer.Add(new Uri(Request.Url.ToString()), cookie); 
} 

//later: 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.url.com/foobar"); 
request.CookieContainer = myContainer; 
+0

Не думаю, что я понимаю, как реализовать свою идею. Запрос runTest будет выполнен после первоначального входа в систему, и я не буду знать имена файлов cookie. Не могли бы вы подробнее остановиться? – Alex

+0

@Alex: Я пересмотрел свой ответ на http cookie - мой первоначальный ответ, который я адаптировал из использования SOAP-сервиса, где вы можете сделать запрос на вход, а затем получить куки-файлы из одной и той же переменной – BrokenGlass

+0

Я не уверен, где именно я подойду код с моим. У меня нет переменной «Response», и мое приложение не понимает, что такое HttpCookie. Спасибо за помощь снова. – Alex