9

少し調べてみたところ、ほとんどの人は大量のデータを送信するときにこれにヒットするようですが、私はそうではありません。

次のように API にリクエストを送信しています。

request.Method = "POST";
request.ContentType = "application/json";
request.Accept = "application/json";
request.Headers.Add("Cookie", "$Version=0; GDCAuthTT=" + TToken + "; $Path=/gdc/account");

//generate request parameters
ReportRequest.RootObject reportRequest = new ReportRequest.RootObject();
reportRequest.report_req = new ReportRequest.ReportReq();
reportRequest.report_req.reportDefinition = ReportLink;
JavaScriptSerializer serializer = new JavaScriptSerializer();
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(serializer.Serialize(reportRequest));
request.ContentLength = byteArray.Length;

using (var writer = new System.IO.StreamWriter(request.GetRequestStream(), Encoding.UTF8, byteArray.Length))
{
    writer.Write(byteArray);
}

最後の閉じ括弧で例外が発生します。

すべてのバイトが書き込まれるまで、ストリームを閉じることはできません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.IO.IOException: すべてのバイトが書き込まれるまでストリームを閉じることはできません。

ソース エラー:

176 行目: { 177 行目:
writer.Write(byteArray); 178 行目: } 179 行目:
string responseContent; 180行目: using (var response = request.GetResponse() as System.Net.HttpWebResponse)

ソース ファイル: c:\Users\james.billings\Documents\Visual Studio 2012\Projects\PhoneMonitor\PhoneMonitor\GoodData\DataRetriever.cs
行: 178

スタックトレース:

[IOException: すべてのバイトが書き込まれるまでストリームを閉じることはできません。]
System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) +604

[WebException: リクエストが中止されました: リクエストがキャンセルされました。]
System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) +6443608
System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState) +37 システム.Net.ConnectStream.Dispose(ブール値の破棄) +44

手がかりはありますか?具体的には、GoodData API 呼び出し xtab2/executor3 を使用しようとしています - http://docs.gooddata.apiary.io/を参照してください

" " を削除するとset ContentLength、400 Bad Request が返されます。以前の GET リクエスト (正常に動作する) のように 0 に設定すると、バッファーの長さを超えて書き込もうとしたというエラーが表示されますが、これは理にかなっています。

ちょっと困惑!

4

3 に答える 3

42

request.ContentLength = byteArray.Length;要求ストリームを書き込む前に設定しないでください。はrequest.ContentLength自動的に設定されます。

于 2016-02-16T20:53:43.237 に答える