Send a content type “multipart/form-data” request from C#






3.32/5 (10 votes)
How to send a content type “multipart/form-data” request from C#.
Introduction
Here we will see a simple procedure to make a request of type "multipart/form-data" from C# using the HttpWebRequest
class. We are taking this article as a reference: Send a request to an SSL page from C#.
Content
The big problem of this type of request is how to prepare the data package that will be passed to the class. For this, the more easy way to do is to make a string with the data in text form. You must be careful with this, because if you put the wrong character or separator, the package won't get to the destination successfully.
The next method makes this action about a parameters collection; these parameters can be of different types, because this way you can send the file content.
private string GetPostData()
{
string boundary = "--" + this._Boundary;
int arrReqs = this._ParamsCollection.Count * 5;
string[] auxReqBody = new string[arrReqs];
int count = 0;
foreach(ParamsStruct par in this._ParamsCollection)
{
auxReqBody[count] = boundary;
count++;
switch (par.Type)
{
case ParamsStruct.ParamType.File:
{
auxReqBody[count] = "Content-Disposition: file; name=\"" +
par.Name + "\"; filename=\"" + par.GetOnlyFileName() + "\"";
count++;
auxReqBody[count] = "Content-Type: text/plain";
count++;
auxReqBody[count] = "";
count++;
auxReqBody[count] = par.StringValue;
count++;
break;
}
case ParamsStruct.ParamType.Parameter:
default:
{
auxReqBody[count] =
"Content-Disposition: form-data; name=\"" + par.Name + "\"";
count++;
auxReqBody[count] = "";
count++;
auxReqBody[count] = par.StringValue;
count++;
break;
}
}
}
auxReqBody[count] = boundary;
count++;
string requestBody = String.Join("\r\n",auxReqBody);
return requestBody;
}
Then in the parameters collection, we have: a parameter of type "Parameter", name "param1", and value "param1Value", and another parameter of type "File", name "file", file name "fileName1.txt", and value "Content of fileName1.txt". After we run this method, you will obtain a text with this format:
--AaB03x\r\n
Content-Disposition: form-data; name="param1"\r\n
\r\n
param1Value\r\n
--AaB03x\r\n
Content-Disposition: file; name="file"; filename="fileName1.txt"\r\n
Content-Type: text/plain\r\n
\r\n
Content of fileName1.txt \r\n
--AaB03x\r\n
After this, we will use a method similar to this one, for sending the information to the required page:
public void PostData ()
{
//Set URL
Uri urlUri = new Uri(_URL);
//Encoding postData
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = this.GetPostData();
byte[] buffer = encoding.GetBytes( postData );
// Prepare web request...
HttpWebRequest myRequest =
(HttpWebRequest)WebRequest.Create(urlUri);
// We use POST ( we can also use GET )
myRequest.Method = this._Method;
myRequest.AllowWriteStreamBuffering = true;
// Set the content type to a FORM
string auxContent = this._ContentType;
if (this._Boundary.Length > 0)
auxContent += "boundary=" + this._Boundary;
myRequest.ContentType = auxContent;
// Get length of content
myRequest.Accept = this._Accept;
myRequest.ContentLength = buffer.Length;
// Get request stream
Stream newStream = myRequest.GetRequestStream();
// Send the data.
newStream.Write(buffer,0,buffer.Length);
// Close stream
newStream.Close();
_myHttpWebResponse= (HttpWebResponse)myRequest.GetResponse();
// Set the response to ResponseStream property
this._ResponseStream = _myHttpWebResponse.GetResponseStream();
}
For finishing this, we must process the request stream returned by the required page. In this case, I declare a property inside the class that transforms the response stream to a string.
public string ResponseString
{
get
{
string resultData = "";
StreamReader streamRead = new StreamReader( _ResponseStream );
Char[] readBuffer = new Char[256];
// Read from buffer
int count = streamRead.Read( readBuffer, 0, 256 );
while (count > 0)
{
// get string
resultData += new String( readBuffer, 0, count);
// Write the data
Console.WriteLine( resultData );
// Read from buffer
count = streamRead.Read( readBuffer, 0, 256);
}
// Release the response object resources.
streamRead.Close();
return resultData;
}
}
In a simple way, this will adapt to another content type. Remember that the key is the form for loading the data package.
For SSL pages, see Send a request to an SSL page from C#.