SSIS Script Task to Upload a File to a Website using C#, HTTP Post with HttpWebRequest

Need a way to upload a generated file to a website using SSIS? The code below uses HttpWebRequest to make page requests, HttpWebResponse to get server responses and CookieContainer to hold the session data.

The website required a session cookie along with login credentials. To complicate things even more the cookie was created on one page, login was on another and file upload was on a third page.

The final result is a way to upload a file to a website using SSIS without any specials tools. This is an alternative to legacy WGET scripts.

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.IO;
using System.Text;
using System.Net;

namespace ST_{GUID}.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        public void Main()
        {
            HttpWebRequest wPost;
            HttpWebResponse wResponse;
            CookieContainer cookieCont;
            DateTime fileDate = DateTime.Now;

            //suppress self signed cert error if necessary
            //ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

            string hostURL = @"https://website.com";
            //string testURL = @"https://test.website.com";
            string cookieURL = "/index.html";
            string loginURL = "/loginpage";
            string uploadURL = "/uploadpage";
            string fileToLoad = @"\\server\path\file_" + String.Format("{0:yyyy-MM-dd}", fileDate) + ".txt";
            string userName = "yourLogin";
            string passWord = "yourPassword";
            string loginData = "username=" + userName + "&password=" + passWord;
            byte[] byteArrayLogin = Encoding.UTF8.GetBytes(loginData);

            //get cookie from the first page            
            wPost = (HttpWebRequest)WebRequest.Create(hostURL + cookieURL);
            wPost.CookieContainer = new CookieContainer();
            cookieCont = wPost.CookieContainer;

            //get response
            wResponse = (HttpWebResponse)wPost.GetResponse();
            wResponse.Close();

            //post login creds to login page
            wPost = (HttpWebRequest)WebRequest.Create(hostURL + loginURL);
            wPost.Method = "POST";
            wPost.CookieContainer = cookieCont;
            wPost.ContentType = "application/x-www-form-urlencoded";
            wPost.ContentLength = byteArrayLogin.Length;

            //get request stream and write login data to it
            using (Stream s = wPost.GetRequestStream())
            {
                s.Write(byteArrayLogin, 0, byteArrayLogin.Length);
                s.Close();
            }

            //get response
            wResponse = (HttpWebResponse)wPost.GetResponse();
            wResponse.Close();

            //upload file
            wPost = (HttpWebRequest)WebRequest.Create(hostURL + uploadURL);
            wPost.Method = "POST";
            //set timeout threshold to 5 mins to allow script to run against slow servers
            wPost.Timeout = 600000;
            wPost.CookieContainer = cookieCont;
            wPost.ContentType = "application/x-www-form-urlencoded";

            Stream uploadStream = wPost.GetRequestStream();
            StreamWriter sourceWriter = new StreamWriter(uploadStream);

            //open file
            StreamReader sourceFile = new StreamReader(fileToLoad);

            //loop through file and read each line and write to request stream buffer
            string inLine = sourceFile.ReadLine();
            while (inLine != null)
            {
                sourceWriter.WriteLine(inLine);
                inLine = sourceFile.ReadLine();
            }

            sourceFile.Close();
            sourceWriter.Close();

            //get response
            wResponse = (HttpWebResponse)wPost.GetResponse();

            Stream receiveStream = wResponse.GetResponseStream();
            StreamReader rdrResp = new StreamReader(receiveStream, Encoding.UTF8);
            //output response here if needed
            rdrResp.Close();
            wResponse.Close();

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

1 thought on “SSIS Script Task to Upload a File to a Website using C#, HTTP Post with HttpWebRequest”

Leave a Comment

Your email address will not be published. Required fields are marked *