C# 在写入所有字节之前无法关闭流(GoodData API)
我做了一些搜索,大多数人在发送大量数据时似乎都会遇到这种情况,但我没有 我向API发出以下请求:C# 在写入所有字节之前无法关闭流(GoodData API),c#,asp.net,.net,gooddata,C#,Asp.net,.net,Gooddata,我做了一些搜索,大多数人在发送大量数据时似乎都会遇到这种情况,但我没有 我向API发出以下请求: request.Method = "POST"; request.ContentType = "application/json"; request.Accept = "application/json"; request.Headers.Add("Cookie", "$Version=0; GDCAuthTT=" + TToken + "; $Path=/gdc/account"); //gen
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);
}
例外情况发生在最后一个结束括号上:
在写入所有字节之前无法关闭流。描述:安
执行当前网站时发生未处理的异常
要求请查看堆栈跟踪以了解有关堆栈的更多信息
错误及其在代码中的起源
异常详细信息:System.IO.IOException:无法关闭流,直到
所有字节都被写入
源错误:
第176行:{第177行:writer.Write(byteArray);第178行:}第179行:
字符串响应内容;第180行:使用(var)响应= request.GetResponse()作为System.Net.HttpWebResponse) 源文件:c:\Users\james.billings\Documents\Visual Studio 2012\Projects\PhoneMonitor\PhoneMonitor\GoodData\DataRetriever.cs
电话号码:178 堆栈跟踪: [IOException:在写入所有字节之前无法关闭流。]
System.Net.ConnectStream.CloseInternal(布尔内部调用,布尔 流产)+604 [WebException:请求被中止:请求被取消。]
System.Net.ConnectStream.CloseInternal(布尔内部调用,布尔 中止)+6443608
System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)+37 System.Net.ConnectStream.Dispose(布尔处理) +44 有什么线索吗?具体来说,我尝试使用GoodDataAPI调用xtab2/executor3-请参阅 如果我删除“
设置ContentLength
”,我会收到一个400错误的请求。如果我像前面的GET请求一样设置为0(工作正常),我会得到一个错误,我试图写入的长度超过了缓冲区的长度,这是有意义的
有点难堪 查看了文档之后--似乎没有写入字节的方法 唯一与签名匹配的方法是-
StreamWriter.Write(Object)
。但是,这会调用对象上的ToString()
,并写入输出;这不是你想要的
设置输出缓冲区时;流正在等待此缓冲区被填充。但是,Object.ToString()
可能无法填充此缓冲区,因此会出现错误
使用
BinaryWriter
、BufferedStream
或其他支持byte[]写入的文件。不要设置request.ContentLength=byteArray.Length代码>在写入请求流之前。request.ContentLength
是自动设置的。对我来说,Json请求中的特殊字符(é)出错了。出于某种原因,我不得不手动设置ContentLength
多亏了上面的提示,我把代码改成了下面的代码,对我来说现在就可以了
旧版本:
string content = "{ test: \"olé\" }";
_Request.ContentLength = content.Length;
using ( var writer = new StreamWriter(_Request.GetRequestStream()) )
writer.Write( content );
新版本:
string content = "{ test: \"olé\" }";
byte[] bytes = Encoding.UTF8.GetBytes(content);
_Request.ContentLength = bytes.Length;
using ( var writer = _Request.GetRequestStream() )
writer.Write(bytes, 0, bytes.Length);
你救了我,伙计,谢谢!