次のエラーが発生し続ける理由がわからないようです。
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);
}
}
3つの可能なオプションがあります
@ reneからの回答 の説明に従ってContentLengthを修正します
ContentLengthを設定しないでください。HttpWebRequestがデータをバッファリングし、ContentLengthを自動的に設定します。
SendChunkedプロパティをtrueに設定し、ContentLengthを設定しないでください。リクエストは、エンコードされたチャンクをウェブサーバーに送信します。 (HTTP 1.1が必要であり、Webサーバーでサポートされている必要があります)
コード:
...
request.SendChunked = true;
using (Stream writeStream = request.GetRequestStream())
{ ... }
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
したがって、文字列の長さと特定のエンコーディングに必要なバイト数は異なる場合があることに注意してください。