少し調べてみたところ、ほとんどの人は大量のデータを送信するときにこれにヒットするようですが、私はそうではありません。
次のように 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 に設定すると、バッファーの長さを超えて書き込もうとしたというエラーが表示されますが、これは理にかなっています。
ちょっと困惑!