执行POST时C#SDK中的错误

时间:2014-04-17 07:50:36

标签: smartsheet-api smartsheet-c#-sdk-v1

我正在使用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

1 个答案:

答案 0 :(得分:1)

感谢您引起我们的注意!我们能够在今天推出的版本中包含此修复程序。只需升级您的软件包using NuGet或从Github下载latest source code即可。

此版本的更改列表如下:

  • 修复了未正确处理内容正文的帖子请求的问题。
  • 为ColumnToSheetBuilder类添加了索引。
  • 上传附件时添加了文件名。

技术细节

此问题是在我们发布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();
                        }
                }
        }