web-dev-qa-db-ja.com

エラー(HttpWebRequest):ストリームに書き込まれるバイトが指定されたContent-Lengthバイトサイズを超えています

次のエラーが発生し続ける理由がわからないようです。

Bytes to be written to the stream exceed the Content-Length bytes size specified.

次の行で:

writeStream.Write(bytes, 0, bytes.Length);

これはWindowsフォームプロジェクトにあります。ここで何が起こっているのか誰かが知っているなら、私はきっとあなたに借りがあるでしょう。

    private void Post()
    {


        HttpWebRequest request = null;
        Uri uri = new Uri("xxxxx");
        request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        XmlDocument doc = new XmlDocument();
        doc.Load("XMLFile1.xml");
        request.ContentLength = doc.InnerXml.Length;
        using (Stream writeStream = request.GetRequestStream())
        {
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] bytes = encoding.GetBytes(doc.InnerXml);
            writeStream.Write(bytes, 0, bytes.Length);
        }
        string result = string.Empty;

        request.ProtocolVersion = System.Net.HttpVersion.Version11;
        request.KeepAlive = false;
        try
        {
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (System.IO.StreamReader readStream = new System.IO.StreamReader(responseStream, Encoding.UTF8))
                    {
                        result = readStream.ReadToEnd();
                    }
                }
            }
        }
        catch (Exception exp)
        {
            // MessageBox.Show(exp.Message);
        }
    }
11
Vigs

3つの可能なオプションがあります

  • @ reneからの回答 の説明に従ってContentLengthを修正します

  • ContentLengthを設定しないでください。HttpWebRequestがデータをバッファリングし、ContentLengthを自動的に設定します。

  • SendChunkedプロパティをtrueに設定し、ContentLengthを設定しないでください。リクエストは、エンコードされたチャンクをウェブサーバーに送信します。 (HTTP 1.1が必要であり、Webサーバーでサポートされている必要があります)

コード:

...
request.SendChunked = true;
using (Stream writeStream = request.GetRequestStream())
{ ... }
15
Lakerfield

InnerXmlのエンコードされたバイト配列は、 TF8エンコード の一部の文字が1文字で2バイトまたは3バイトを占めるため、長くなる可能性があります。

次のようにコードを変更します。

    using (Stream writeStream = request.GetRequestStream())
    {
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] bytes = encoding.GetBytes(doc.InnerXml);
        request.ContentLength = bytes.Length;
        writeStream.Write(bytes, 0, bytes.Length);
    }

何が起こっているかを正確に示すには、これを LINQPad で試してください。

var s = "é";
s.Length.Dump("string length");
Encoding.UTF8.GetBytes(s).Length.Dump("array length");

これは出力します:

 string length: 1 
 array length:  2 

そして今、アポストロフィなしでeを使用します:

var s = "e";
s.Length.Dump("string length");
Encoding.UTF8.GetBytes(s).Length.Dump("array length");

これは出力します:

string length: 1 
array length:  1 

したがって、文字列の長さと特定のエンコーディングに必要なバイト数は異なる場合があることに注意してください。

10
rene