2010-11-02 16 views
3

我已經寫了下面的代碼來構建一個POST,使用我在stackoverflow上找到的PostData類。在C#中構建一個POST#

 PostData pd = new PostData(); 
     pd.Params.Add(new PostDataParam("sessionId", "0", PostDataParamType.Field)); 
     pd.Params.Add(new PostDataParam("guestId", "1", PostDataParamType.Field)); 

     HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(new Uri("http://oe1235/test/uploadTest.php").AbsoluteUri); 

     webrequest.ContentType = "multipart/form-data; boundary=" + pd.Boundary; 
     webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     webrequest.Headers.Add("Accept-Language: en-gb,en;q=0.5"); 
     webrequest.Headers.Add("Accept-Encoding: gzip,deflate"); 
     webrequest.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
     webrequest.Headers.Add("Keep-Alive: 115"); 
     webrequest.Referer = "http://localhost/test/test.php"; 
     webrequest.Headers.Add("Cache-Control: max-age=0"); 
     webrequest.Method = "POST"; 


     byte[] content = Encoding.ASCII.GetBytes(pd.GetPostData()); 
     webrequest.ContentLength = content.Length; 
     Stream request = webrequest.GetRequestStream(); 
     request.Write(content, 0, content.Length); 
     try { 
      Console.Write(webrequest.GetResponse()); 
     } catch (Exception e) { 
      Console.Write("Error: " + e.ToString()); 
     } 
     Console.ReadLine(); 

我監測與查爾斯的請求/響應,我也得到了以下內容:

POST /test/uploadTest.php HTTP/1.1 
Content-Type: multipart/form-data; boundary=----------8cd4899a18b409a 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Referer: http://localhost/test/test.php 
Cache-Control: max-age=0 
Host: oe1235 
Content-Length: 275 
Expect: 100-continue 

----------8cd4899a18b409a 
Content-Disposition: form-data; name="email" 

MyEmail 
----------8cd4899a18b409a 
Content-Disposition: form-data; name="sessionId" 

0 
----------8cd4899a18b409a 
Content-Disposition: form-data; name="guestId" 

1 
----------8cd4899a18b409a-- 

我用盡了一切我能想到的,但它仍然沒有出現被有效(我的POST接收器沒有響應,Charles報告「無法解碼多部分主體」,所以我做了錯誤的事情。我的邊界看起來沒問題,我在所有正確的位置都有換行符,我比較了它到Firefox構建的POST,並且它們看起來(幾乎 - 除了一個或兩個標題)相同。

回答

3

解決了它 - 我認爲當邊界被指定時,它應該包含兩個前導字符,但不應該包含這兩個前導字符。因此,在內容頭中指定我的邊界應該是:

----------8cd4899a18b409a 

然後將每個項目之間:

------------8cd4899a18b409a 

更簡單地說,如果你的邊界是:

Content-Type: multipart/form-data; boundary=myboundary 

,每個項目之間它應該是:

--myboundary 
1

也許問題是在邊界開始處缺少兩條破折號。

請參閱http://en.wikipedia.org/wiki/MIME#Multipart_messages以獲取有關多部分機構應該如何查看的更多信息。

+0

是的 - 我沒有意識到兩個主要的破折號*不應該被包含在Content-Type頭部的邊界規範中。 – jaucourt 2010-11-02 19:05:00

0

檢查this了。這是來自社區的答案,絕不讓我失望。 您也可以檢查​​。