سؤال

لذلك أنا أحاول نشر شيء إلى خادم الويب.

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 () مع "بايت مكتوب إلى الدفق يتجاوز حجم طول المحتوى المحدد"

هو streamwriter القيام بعض السحر وراء ظهري أنا لست على علم؟ هل هناك طريقة يمكنني أن أؤديها إلى ما يفعله StreamWriter؟

هل كانت مفيدة؟

المحلول

أوضحت إجابات أخرى كيفية تجنب هذا، لكنني اعتقدت أنني سأجيب لماذا يحدث ذلك: أنت تنتهي مع بايت أمر العلامة قبل المحتوى الفعلي الخاص بك.

يمكنك تجنب هذا عن طريق الاتصال new UTF8Encoding(false) بدلا من استخدام Encoding.UTF8. وبعد إليك برنامج قصير لإظهار الفرق:

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);
    }

}

نصائح أخرى

ربما تجعل مثل أسهل:

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

أو انظر هنا لمناقشة تسمح باستخدام مثل:

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

لا تحتاج إلى تعيين quttylength صريحا، حيث سيتم تعيين تلقائيا إلى حجم البيانات المكتوبة لطلب دفق عند إغلاقه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top