2009-11-18 60 views
1

這是推動我堅果:爲什麼我在執行HTTP POST時耗盡流的字節?

WebRequest request = WebRequest.Create(url); 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = Encoding.UTF8.GetByteCount(data); 
    Stream reqs = request.GetRequestStream(); 
    StreamWriter stOut = new StreamWriter(reqs, Encoding.UTF8); 
    stOut.Write(data); 
    stOut.Flush(); 

,我感到我已經用完流中的字節的例外......但我已經使用了相同的編碼得到的字節數!

使用ASCII這不會失敗。 這是因爲Windows喜歡添加的UTF-8 BOM嗎?

+0

如果你只是把'.ContentLength ='賦值出去了會發生什麼? AFAIK應該在發送請求之前自動確定「ContentLength」。 – dtb 2009-11-18 21:30:25

+0

跳過.ContentLength賦值工作。 – Broam 2009-11-18 22:25:13

回答

3

這可能是BOM;嘗試使用沒有BOM的明確編碼:

Encoding enc = new UTF8Encoding(false); 
... 
request.ContentLength = enc.GetByteCount(data); 
... 
StreamWriter stOut = new StreamWriter(reqs, enc); 

更簡單;改爲切換到WebClient,並嘗試自己處理;這是很容易張貼這個形式:

using (var client = new WebClient()) 
    { 
     var data = new NameValueCollection(); 
     data["foo"] = "123"; 
     data["bar"] = "456"; 
     byte[] resp = client.UploadValues(address, data); 
    } 

或者與代碼from here

byte[] resp = client.Post(address, new {foo = 123, bar = 546}); 
+0

最簡單的做法是跳過內容長度分配......但這絕對是由於BOM。 – Broam 2009-11-18 22:25:48

+0

使用顯式編碼對象工作。 – Broam 2009-11-18 22:28:35

1

您也可以嘗試這樣的事:

byte[] bytes = Encoding.UTF8.GetBytes(data); 

request.ContentLength = bytes.Length; 
request.GetRequestStream().Write(bytes, 0, bytes.Length); 
1

不要忘記實際上是對數據進行網址編碼,就像您在ContentType中所承諾的一樣。這是一個單行的:

byte[] bytes = System.Web.HttpUtility.UrlEncodeToBytes(data, Encoding.UTF8); 
相關問題