我正在使用C#SDK,似乎在执行任何POST时都存在错误。 post body被序列化为字符串“System.IO.StringReader”。这似乎是因为Internal / Http / DefaultHttpClient.cs
中的第127行我改变了代码:
restRequest.AddParameter("application/json", smartsheetRequest.Entity.GetContent(),ParameterType.RequestBody);
为:
restRequest.AddParameter("application/json", smartsheetRequest.Entity.GetContent().ReadToEnd(),ParameterType.RequestBody);
似乎解决了这个问题。来自Smartsheet的人可以检查并确认吗?
THX
答案 0 :(得分:1)
感谢您引起我们的注意!我们能够在今天推出的版本中包含此修复程序。只需升级您的软件包using NuGet或从Github下载latest source code即可。
此版本的更改列表如下:
此问题是在我们发布1.0.1版本的前两天推出的,具体是由于提交2d69ef5b8f95dbe911d9bb1ecb50a6a441b522b5而导致ReadToEnd()方法被删除以支持二进制附件。
这个问题是由你指向smartsheetRequest.Entity.GetContent()
允许restRequest对象调用ToString()的行所引起的,它为我们提供了如下所示的请求体:
POST https://api.smartsheet.com/1.1/home/folders HTTP/1.1
Authorization: Bearer THE_TOKEN
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: smartsheet-csharp-sdk(sdk-csharp-sample)/0.0.0.1 Microsoft Windows 7 Enterprise
Content-Type: application/json
Host: api.smartsheet.com
Content-Length: 22
Accept-Encoding: gzip, deflate
System.IO.StreamReader
最后一行应该是StreamReader的真实内容而不是StreamReader的ToString()。
你提到的在StreamReader上使用ReadToEnd()的解决方案是一个很好的解决方案,除了它不处理二进制数据。我们使用GetBinaryContent()
方法实现了此更改。然后我们使用Util.ReadAllBytes(...)
将其转换为字节数组。
下面以差异格式列出了确切的更改:
diff --git a/main/Smartsheet/Api/Internal/Http/DefaultHttpClient.cs b/main/Smartsheet/Api/Internal/Http/DefaultHttpClient.cs
index 5913935..df6d7d5 100644
--- a/main/Smartsheet/Api/Internal/Http/DefaultHttpClient.cs
+++ b/main/Smartsheet/Api/Internal/Http/DefaultHttpClient.cs
@@ -121,10 +121,10 @@ namespace Smartsheet.Api.Internal.Http
restRequest.AddHeader(header.Key, header.Value);
}
}
-
+
if (smartsheetRequest.Entity != null && smartsheetRequest.Entity.GetContent() != null)
{
- restRequest.AddParameter("application/json", smartsheetRequest.Entity.GetContent(),
+ restRequest.AddParameter("application/json", Util.ReadAllBytes(smartsheetRequest.Entity.GetBinaryContent()),
ParameterType.RequestBody);
}
diff --git a/main/Smartsheet/Api/Internal/Util/Util.cs b/main/Smartsheet/Api/Internal/Util/Util.cs
index ee97b41..c3d48c6 100644
--- a/main/Smartsheet/Api/Internal/Util/Util.cs
+++ b/main/Smartsheet/Api/Internal/Util/Util.cs
@@ -85,8 +85,11 @@ namespace Smartsheet.Api.Internal.Utility
byte[] buffer = new byte[bufferSize];
int count;
while ((count = reader.Read(buffer, 0, buffer.Length)) != 0)
+ {
ms.Write(buffer, 0, count);
- return ms.ToArray();
+ }
+ ms.Position = 0;
+ return ms.ToArray();
}
}
}