//--------------------------------------------------------------------------------------- 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); } }