//---------------------------------------------------------------------------------------
        private DataGovParameters SetParameters()
        {
            const string      IdKey      = "id";
            DataGovParameters Parameters = new DataGovParameters();

            Parameters.ApiKey        = this.TextBoxApiKey.Text;
            Parameters.Filename      = this.TextBoxFileName.Value;
            Parameters.CkanUrlUpdate = WebConfigSettings.DataGovCkanUpdateUrl;
            Parameters.NameValueCollection.Add(IdKey, this.TextBoxResourceId.Text);
            return(Parameters);
        }
        /*---------------------------------------------------------------------------------------
         * Configure request as multipart/form-data
         * ---------------------------------------------------------------------------------------*/
        private static HttpWebRequest ConfigureUploadRequest(DataGovParameters parameters, string boundary)
        {
            HttpWebRequest PostRequest = (HttpWebRequest)WebRequest.Create(parameters.CkanUrlUpdate);

            // Content type is  multipart/form-data and includes the boundary information
            PostRequest.ContentType = "multipart/form-data; boundary=" + boundary;
            PostRequest.Method      = "POST";
            PostRequest.KeepAlive   = true;
            PostRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
            // Include Authorization and your API key in the request header
            PostRequest.Headers.Add("Authorization", parameters.ApiKey);
            PostRequest.Timeout = WebConfigSettings.TimeoutMilliseconds;
            return(PostRequest);
        }
        /*---------------------------------------------------------------------------------------
        * Upload a new version of the document as a multipart/form-data
        *  ---------------------------------------------------------------------------------------*/
        private static DataGovOutcome Postfile(DataGovParameters parameters)
        {
            // Boundary is a unique string used to deliminate form values sent in the request
            string Boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");

            byte[] BoundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + Boundary + "\r\n");

            HttpWebRequest PostRequest = null;
            Stream         PostStream  = null;
            DataGovOutcome Outcome     = new DataGovOutcome();

            try {
                PostRequest = ConfigureUploadRequest(parameters, Boundary);
                PostStream  = PostRequest.GetRequestStream();
                PostStandardFormHeader(PostStream, BoundaryBytes, parameters);
                PostFilenameHeader(PostStream, BoundaryBytes, parameters.Filename);
                PostFileContentsData(PostStream, parameters.Filename);
                PostTrailerData(PostStream, Boundary);
                Outcome.PostStatus = ReadPostResponse(PostRequest);
                Outcome.Success    = true;
            } // The web response may contain more information about the exception
            catch (WebException ex) {
                if (ex.Response != null)
                {
                    using (Stream ErrorStream = ex.Response.GetResponseStream())
                        using (StreamReader reader = new StreamReader(ErrorStream)) {
                            Outcome.PostStatus = reader.ReadToEnd();
                            Outcome.Success    = false;
                            return(Outcome);
                        }
                }
                else
                {
                    throw;
                }
            }
            catch  {
                throw;
            }
            finally {
                if (PostStream != null)
                {
                    PostStream.Close();
                    PostRequest = null;
                }
            }
            return(Outcome);
        }
        //---------------------------------------------------------------------------------------
        public static DataGovOutcome UploadToDataGov(DataGovParameters parameters)
        {
            DataGovOutcome Outcome = null;

            try {
                Outcome = Postfile(parameters);
                if (Outcome.Success)
                {
                    return(ResponseInterpreter.InterpretResponse(Outcome.PostStatus));
                }
                else
                {
                    return(Outcome);
                }
            }
            catch {
                throw;
            }
        }
        /*---------------------------------------------------------------------------------------
         * The standard form value is written to the request stream as:
         *    Encoded boundary comprising 2 dashes, boundary, CRLF
         *    Content-Disposition: form-data; name=<resource Id>
         *    2 CRLFs
         *    The value of the form field
         *    1 CRLF
         * ---------------------------------------------------------------------------------------*/
        private static void PostStandardFormHeader(Stream postStream, byte[] boundaryBytes, DataGovParameters parameters)
        {
            string Template = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";

            foreach (string key in parameters.NameValueCollection.Keys)
            {
                postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                string FormItem      = string.Format(Template, key, parameters.NameValueCollection[key]);
                byte[] FormItemBytes = Encoding.UTF8.GetBytes(FormItem);
                postStream.Write(FormItemBytes, 0, FormItemBytes.Length);
            }
        }