This is a migrated thread and some comments may be shown as answers.

HTTP POST with binary data in .NET

2 Answers 1419 Views
Getting started with ASP.NET
This is a migrated thread and some comments may be shown as answers.
mdanh2002
Top achievements
Rank 1
mdanh2002 asked on 22 Jul 2007, 03:50 AM
Hi

From VB.NET I want to simulate the POST request of the following HTML form

<html>   
<title>HTTP Post Testing</title>   
<body>   
<form action=http://www.example.com/postdata   
enctype="multipart/form-data" method="post" name="testform">   
<input id="user_login" name="user[login]" size="30" type="hidden"   
value="user01" />   
<input id="user_password" name="user[password]" size="30"   
type="hidden" value="123456" />   
               <table>   
                       <tr>   
                               <td>File:</td>   
 
                               <td><input id="file" name="file"   
type="file" /></td>   
                       </tr>   
                       <tr>   
                               <td colspan="2"><input name="commit"   
type="submit" value="Upload" name="upload"/></td>   
                       </tr>   
               </table>   
       </form>   
</body>   
</html>  

The target URL would return "OK" for successful upload and empty otherwise.

My code to generate the POST request is as followed:

        Try 
            Dim request As HttpWebRequest = CType(WebRequest.Create(Me.txtURL.Text), HttpWebRequest) 'this textbox contains the target URL of the request  
            ' Set the Method property of the request to POST.  
            request.Method = "POST" 
            request.Accept = "*/*" 
            request.UserAgent = "curl/7.16.3" 
            request.ProtocolVersion = HttpVersion.Version11  
            request.Referer = "http://www.mydomain.com/" 
            request.SendChunked = True 
 
            System.Net.ServicePointManager.Expect100Continue = False 
 
            ' Create POST data and convert it to a byte array.  
            Dim postData As String = "" 
 
            postData += Boundary + Chr(13) + Chr(10) + "Content-Disposition: form-data; name=""user[login]""" + Chr(13) + Chr(10) + Chr(13) + Chr(10)  
            postData += "gape" + Chr(13) + Chr(10)  
            postData += Boundary + Chr(13) + Chr(10) + "Content-Disposition: form-data; name=""user[password]""" + Chr(13) + Chr(10) + Chr(13) + Chr(10)  
            postData += "telipoint8" + Chr(13) + Chr(10)  
            postData += Boundary + Chr(13) + Chr(10) + "Content-Disposition: form-data; name=""file""; filename=""helpcurl.txt""" + Chr(13) + Chr(10)  
            postData += "Content-Type: text/plain" + Chr(13) + Chr(10) + Chr(13) + Chr(10)  
            postData += "fdfgfggfbfgggggggggggggggg" + Chr(13) + Chr(10) + Boundary + "--" + Chr(13) + Chr(10)  
 
            Dim encoding As New System.Text.ASCIIEncoding()  
            Dim byteArray As Byte() = encoding.GetBytes(postData)  
 
            ' Set the ContentType property of the WebRequest.  
            'request.ContentType = "application/x-www-form-urlencoded"  
            request.ContentType = "multipart/form-data; boundary=" + Me.Boundary + vbCrLf + vbCrLf  
            ' Set the ContentLength property of the WebRequest.  
            request.ContentLength = byteArray.Length  
 
            ' Get the request stream.  
            Dim dataStream As Stream = request.GetRequestStream()  
            ' Write the data to the request stream.  
            dataStream.Write(byteArray, 0, byteArray.Length)  
            ' Close the Stream object.  
            dataStream.Close()  
 
            ' Get the response.  
            Dim response As WebResponse = request.GetResponse()  
            ' Display the status.  
            MsgBox(CType(response, HttpWebResponse).StatusDescription, MsgBoxStyle.Information, "Response Code")  
 
            ' Get the stream containing content returned by the server.  
            dataStream = response.GetResponseStream()  
 
            ' Open the stream using a StreamReader for easy access.  
            Dim reader As New StreamReader(dataStream)  
            ' Read the content.  
            Dim responseFromServer As String = reader.ReadToEnd()  
 
            ' Display the content.  
            txtResponse.Text = responseFromServer 'this textbox shows the response from the server  
 
            ' Clean up the streams.  
            reader.Close()  
            dataStream.Close()  
            response.Close()  
        Catch Ex As Exception  
            MsgBox(Ex.Message, MsgBoxStyle.Exclamation, "Error Encountered")  
        End Try 

Here I tried to simulate the upload of a text file. When I tried this code the server alays return 404 (Resource not Found) even though the URL is correct. When the ContentType is changed to "application/x-www-form-urlencoded", i.e. no file upload but only transfer normal text fields, the server seems to accept the request and returns empty (unsucessful upload), which is correct. When I tried the above code (with content-type=multipart-formdata) against an ASP script put on my locahost:

<%  
 
test1 = Request.Form("user[login]")  
test2 = Request.Form("user[password]")  
 
Response.Write(test1 + "<br>" + test2)  
 
%> 

my script returns empty strings, which means the POST request generated by my VB code is malformed. But I cannot see what's wrong. I have compared it to the output of the following curl command

curl -F user[login]=user01 -F user[password]=123456 -F
file=@myfile.txt http://www.readysnap.com/print/mup and everything is exactly the same.

Can anyone suggest what's wrong? Thanks. :)

2 Answers, 1 is accepted

Sort by
0
Peter Double
Top achievements
Rank 1
answered on 22 Oct 2007, 06:23 PM
Why is this question all over the internet but not answered anywhere???

Did anyone every find the answer to this question?

I am having similar problems with creating a curl in .Net
0
Alex
Top achievements
Rank 1
answered on 16 Apr 2009, 01:03 PM
This is not just an issue with VB, I have the same problem when trying to transfer binary data with the HTTP POST method to a PHP page.

It is not just the fact that the data are not transmitted, but the whole variable seems to have disappeared completely at the receiving end. The isset($_POST["password"]) gives false, which means that not only the value of the password is lost from the request but the entire password variable itself.

If anyone knows a work-around for this, please let us know!
Tags
Getting started with ASP.NET
Asked by
mdanh2002
Top achievements
Rank 1
Answers by
Peter Double
Top achievements
Rank 1
Alex
Top achievements
Rank 1
Share this question
or