Как программно войти на сайт, который не возвращает html-ответ, используя c #? Зависает при вызове GetResponse () - PullRequest
0 голосов
/ 04 февраля 2010

Я пытаюсь программно войти на сайт ("http://www.smscountry.com") с использованием C #, но программа зависает при втором запросе GetResponse (), где я пытаюсь войти методом POST и заполняю поля формы.

        public String GetWebContent(String username, String password)
        {

        //The URL of the Login Form of the website
        String urlSignin = "http://www.smscountry.com/";

        //The action URL of the Login Form of the website on Submit
        String urlLogin = "http://www.smscountry.com/LoginCheck.asp?msg=";

        //Initializes the Uri object of the URLs
        Uri uriSignin = new Uri(urlSignin);
        Uri uriLogin = new Uri(urlLogin);

        //Hashtable to store the form details
        Hashtable formData = new Hashtable();
        formData.Add("UTC", new Hashtable());
        formData.Add("txt_Username", new Hashtable());
        formData.Add("txt_Password", new Hashtable());

        ((Hashtable)formData["UTC"])["value"] = -330;
        ((Hashtable)formData["txt_Username"])["value"] = username;
        ((Hashtable)formData["txt_Password"])["value"] = password;

        //Initializing the data for the post action
        String postData = "";

        foreach (string name in formData.Keys)
        {
              postData += "&" + name + "=" + ((Hashtable)formData[name])["value"];
        }
        postData = postData.Substring(1);

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        byte[] data = encoding.GetBytes(postData);

        HttpWebRequest webReq;
        HttpWebResponse webResp;

        //To store the cookies of the response objects to be used for the next request
        CookieContainer cookies = new CookieContainer();

        String responseString = "";

        try
        {
            //Getting response for the Signin page  
            webReq = (HttpWebRequest)WebRequest.Create(urlSignin);
            webResp = (HttpWebResponse)webReq.GetResponse();

            //Storing response cookies to be used in the next request
            cookies.Add(webResp.Cookies);

            //Storing ASPSESSION cookie that appears in the Response header Set-Cookie to be used in the next request
            string sessionCookie = webResp.Headers["Set-Cookie"];
            responseString = new StreamReader(webResp.GetResponseStream()).ReadToEnd();

            string respCookie = sessionCookie.Substring(0, sessionCookie.IndexOf(';'));
            char[] separator  = {'='};
            string[] cookieValues = respCookie.Split(separator);
            cookies.Add(new Cookie(cookieValues[0], cookieValues[1], "/", "www.smscountry.com"));

            //Initializing the request object for log in
            webReq = (HttpWebRequest)WebRequest.Create(urlLogin);
            webReq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            webReq.Referer = urlSignin;
            webReq.KeepAlive = true;
            webReq.Method = "POST";
            webReq.ContentType = "application/x-www-form-urlencoded";
            webReq.ContentLength = data.Length;
            webReq.AllowAutoRedirect = false;
            webReq.CookieContainer = cookies;
            webReq.Timeout = 30000;
            webReq.ReadWriteTimeout = 60000;


            //Get the response for the request to log in
            //PROBLEM OCCURS HERE - THE CODE DOES NOT EXECUTE FURTHER
            webResp = (HttpWebResponse)webReq.GetResponse();
            responseString = new StreamReader(webResp.GetResponseStream()).ReadToEnd();

            webResp.Close();
            return responseString;
        }
        catch (Exception ex)
        {
            throw ex;

        }

    }

Я не понимаю, в чем проблема. Я думаю, что это может иметь какое-то отношение к перенаправлению страницы и невозможности возврата html-ответа, но я не совсем уверен. Есть ли решение этой проблемы? Или я могу как-нибудь войти на этот конкретный сайт?

Ответы [ 4 ]

4 голосов
/ 04 февраля 2010

Вам необходимо отправить свои данные, прежде чем вы сможете получить ответ. Игорь увидел, что вы задали длину контента для запроса, но вместо того, чтобы установить длину контента на 0, вам нужно отправить контент на сервер:

...
webReq.GetRequestStream().write( data, 0, data.Length );
webReq.GetRequestStream().close();
webResp = (HttpWebResponse)webReq.GetResponse();
responseString = new StreamReader(webResp.GetResponseStream()).ReadToEnd();
...

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

0 голосов
/ 04 февраля 2010

Проблема в следующей строке: webReq.ContentLength = data.Length; Здесь вы устанавливаете длину вашего POST-запроса body на значение, большее нуля, в то время как ваше фактическое тело пусто; все, что вы пытаетесь отправить, это заголовок. Замените эту строку на webReq.ContentLength = 0; и все готово.

0 голосов
/ 04 февраля 2010

Попробуйте использовать класс WebClient. Смотри http://msdn.microsoft.com/en-us/library/9w7b4fz7.aspx

0 голосов
/ 04 февраля 2010

Вы смотрели на этот вопрос, возможно, вы можете попытаться применить часть кода в ответе в вашем подходе:

Как программно войти на сайт для создания экрана?

...