2009-11-01 13 views
9

विफल रहा है इसलिए मैं किसी वेबसर्वर को कुछ पोस्ट करने का प्रयास कर रहा हूं।सी # HttpWebRequest POST'ing

System.Net.HttpWebRequest EventReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("url"); 
System.String Content = "id=" + Id; 
EventReq.ContentLength = System.Text.Encoding.UTF8.GetByteCount(Content); 
EventReq.Method = "POST"; 
EventReq.ContentType = "application/x-www-form-urlencoded"; 
System.IO.StreamWriter sw = new System.IO.StreamWriter(EventReq.GetRequestStream(), System.Text.Encoding.UTF8); 
sw.Write(Content); 
sw.Flush(); 
sw.Close(); 

ठीक लग रहा है, मैं इनकोडिंग डेटा के आकार के आधार पर सामग्री-लंबाई सेट कर रहा हूं ... वैसे भी यह sw.flush() "बाइट्स के साथ में विफल रहता है धारा के लिए लिखे जाने की सामग्री से अधिक -लंबाईबद्ध आकार निर्दिष्ट "

क्या स्ट्रीमवाइटर मेरी पीठ के पीछे कुछ जादू कर रहा है, मुझे पता नहीं है? क्या कोई तरीका है कि मैं स्ट्रीमवाइटर क्या कर रहा हूं?

उत्तर

24

अन्य उत्तरों ने समझाया है कि इससे कैसे बचें, लेकिन मैंने सोचा कि मैं जवाब दूंगा कि यह क्यों हो रहा है: आप अपनी वास्तविक सामग्री से पहले byte order mark के साथ समाप्त हो रहे हैं।

Encoding.UTF8 का उपयोग करने के बजाय new UTF8Encoding(false) पर कॉल करके आप इससे बच सकते हैं। अंतर का प्रदर्शन करने के लिए यहां एक छोटा कार्यक्रम दिया गया है:

using System; 
using System.Text; 
using System.IO; 

class Test  
{ 
    static void Main() 
    { 
     Encoding enc = new UTF8Encoding(false); // Prints 1 1 
     // Encoding enc = Encoding.UTF8; // Prints 1 4 
     string content = "x"; 
     Console.WriteLine(enc.GetByteCount("x")); 
     MemoryStream ms = new MemoryStream(); 
     StreamWriter sw = new StreamWriter(ms, enc); 
     sw.Write(content); 
     sw.Flush(); 
     Console.WriteLine(ms.Length); 
    } 

} 
+0

अच्छी जगह। मैंने * सोचा * खोदने के बारे में सोचा, लेकिन ...

+0

आप सर सही हैं :) बताता है कि अन्य टिप्पणी में किए गए तारों से \ 357 \ 273 \ 277 के बारे में अवलोकन। बहुत धन्यवाद! –

4

शायद आसान की तरह करते हैं:

using(WebClient client = new WebClient()) { 
    NameValueCollection values = new NameValueCollection(); 
    values.Add("id",Id); 
    byte[] resp = client.UploadValues("url","POST", values); 
} 

या एक चर्चा की तरह उपयोग करने की अनुमति के लिए here देखें:, आप ContentLength स्पष्ट रूप से सेट नहीं की जरूरत है

client.Post(destUri, new { 
    id = Id // other values here 
}); 
3

यह के आकार के स्वचालित रूप से स्थापित किया जाएगा के बाद से जब आप इसे बंद करते हैं तो स्ट्रीम का अनुरोध करने के लिए लिखा गया डेटा।

+0

आप वास्तव में सही हैं; यह उस विशेष समस्या को हल करता है। लेकिन भेजे गए पैकेट को देखने के लिए वायरशर्क का उपयोग करके पता चलता है कि स्ट्रीमवाइटर POST डेटा में कुछ तैयार कर रहा है ... \ 357 \ 273 \ 277id = 301Rbu उन 3 बाइट्स कहां से आ रहे हैं ??? इस पैकेट में सामग्री-लंबाई 12 पर सेट है। –

+2

@ जोन स्कीट ने इस अच्छी तरह से वर्णन किया (सामान्य =) के रूप में) - यह तथाकथित 'यूनिकोड बाइट-ऑर्डर मार्क' है जो यह पहचानता है कि टेक्स्ट यूटीएफ -8, यूटीएफ -16 बिग-एंडियन, यूटीएफ -16 लिटिल-एंडियन इत्यादि है या नहीं। यहां और पढ़ें http://en.wikipedia.org/wiki/Byte-order_mark –