Поделиться через


How to call a SSL web page programmatically

Not all days are equal. Recently, my day was challenged with a fun but daunting task: to assist a customer to write some C# code to call a https webpage programmatically. Here is what we ended up coding the login page:

Note: Since every site is different, you will need to collect Fiddler trace to intercept the form data and code them accordingly

public partial class Form1 : Form 

{
        CookieContainer cookieJar = null;

        public Form1()
        {
            InitializeComponent();
            cookieJar = new CookieContainer();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //POST form data to authenticate the session
            MakeHttpCall("POST","https://www.mysite.com/login");

        }

        private void MakeHttpCall(string method, string uri)
        {
            HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(uri);
            webReq.CookieContainer = cookieJar;
            webReq.Method = method;

            if(method == "POST"){
                //have to set the POST data content type
                webReq.ContentType = "application/x-www-form-urlencoded";

                //collect the formData from Fiddler trace
                string formData =@"utf8=%E2%9C%93&authenticity_token=%2AAbgakfjdADFOEIRbereoidfnfidfjdfj%2Fb0IeGZRMGqjnw%3D&user%5Blogin%5D=myname&user%5Bpassword%5D=J*@pw%2F%7E%7C%7C%7C&commit=Login";
                webReq.Referer = "https://www.mysite.com/";
                // we need to store the data into a byte array. Content will be what server looking for
                byte[] PostData = System.Text.Encoding.ASCII.GetBytes(formData);
                webReq.ContentLength = PostData.Length;
                Stream tempStream = webReq.GetRequestStream();
                // write the data to be posted to the Request Stream
                tempStream.Write(PostData,0,PostData.Length);
                tempStream.Close();

            }

            //Get the response from the server
            HttpWebResponse webResp = (HttpWebResponse) webReq.GetResponse();
            StreamReader sr = new StreamReader(webResp.GetResponseStream(), Encoding.ASCII);
            //put the stream data in a string
            String respData = sr.ReadToEnd();
            sr.Close();
            webResp.Close();

            if (method == "POST")
            {
                MessageBox.Show(respData.ToString());
            }                              
        }
    }