.NET C#使用类似于Curl脚本的HTTPrequest

时间:2012-12-03 13:44:42

标签: c# .net curl httprequest

我正在使用.NET C#并希望使用HTTPrequest以与在Curl中编写的方式相同的方式进行POST:

curl
--header ’Accept: text/html’
--user ’test1:password’
--Form ’wait=0’
--Form ’data=@data.csv;type=text/csv’
some URL address here

我收到Error 500 Internal error from the Internet server

要发送的数据是CSV文件。

我在C#中的源代码:

string data = "Time, A, B\n20120101, 100, 24\n20120102\n, 101, 27";

// Create a request using a URL that can receive a post.
                    request = WebRequest.Create(url);
                    //Set authorization
                    request.Credentials = new NetworkCredential(username, password);
                    // Set the Method property of the request to POST.
                    request.Method = "POST";

                    // Create POST data and convert it to a byte array.
                    byte[] byteArray = Encoding.UTF8.GetBytes(data);
                    // Set the ContentType property of the WebRequest.
                    request.ContentType = "application/x-www-form-urlencoded";
                    // Set the ContentLength property of the WebRequest.
                    request.ContentLength = byteArray.Length;
                    // Get the request stream.
                    dataStream = request.GetRequestStream();
                    // Write the data to the request stream.
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    // Close the Stream object.
                    dataStream.Close();

// Get the original response.
                WebResponse response = request.GetResponse();
                this.Status = ((HttpWebResponse)response).StatusDescription;
                // Get the stream containing all content returned by the requested server.
                dataStream = response.GetResponseStream();
                // Open the stream using a StreamReader for easy access.
                StreamReader reader = new StreamReader(dataStream);
                // Read the content fully up to the end.
                string responseFromServer = reader.ReadToEnd(); 
                // Clean up the streams.
                reader.Close();
                dataStream.Close();
                response.Close();

我做错了什么?

2 个答案:

答案 0 :(得分:0)

cURL使用multipart / form-data内容类型来创建其请求。我认为这是必需的,因为您传递的是文本参数和文件。遗憾的是,.Net框架似乎没有内置支持来创建这种内容类型。

关于SO的问题提供了如何在此处自行完成的示例代码:Multipart forms from C# client

作为参考,该cURL命令生成的HTTP请求如下所示:

POST http://www.example.com/example HTTP/1.1
Authorization: Basic J3Rlc3Q6cGFzc3dvcmQn
User-Agent: curl/7.33.0
Host: www.example.com
Accept: text/html
Connection: Keep-Alive
Content-Length: 335
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------99aa46d554951aa6

--------------------------99aa46d554951aa6
Content-Disposition: form-data; name="'wait"

0'
--------------------------99aa46d554951aa6
Content-Disposition: form-data; name="'data"; filename="data.csv"
Content-Type: text/csv'

Time, A, B\n20120101, 100, 24\n20120102\n, 101, 27 

--------------------------99aa46d554951aa6--

答案 1 :(得分:-1)

是否需要为表单帖子对数据进行URL编码? http://en.wikipedia.org/wiki/POST_%28HTTP%29#Use_for_submitting_web_forms