Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在写入所有字节之前无法关闭流(GoodData API)_C#_Asp.net_.net_Gooddata - Fatal编程技术网

C# 在写入所有字节之前无法关闭流(GoodData 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

我做了一些搜索,大多数人在发送大量数据时似乎都会遇到这种情况,但我没有

我向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);
}
例外情况发生在最后一个结束括号上:

在写入所有字节之前无法关闭流。描述:安 执行当前网站时发生未处理的异常 要求请查看堆栈跟踪以了解有关堆栈的更多信息 错误及其在代码中的起源

异常详细信息: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);

你救了我,伙计,谢谢!