2

我正在使用 C# SDK,执行任何 POST 时似乎都存在错误。帖子正文被序列化为字符串“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的人可以检查并确认吗?

谢谢

4

1 回答 1

1

谢谢让我们注意到这个!我们能够在今天推出的版本中包含对此的修复。只需使用 NuGet升级您的包或从 Github下载最新的源代码。

此版本的更改列表如下:

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

技术细节

此问题是在我们发布 1.0.1 版本前两天于 3 月 17 日引入的,具体是由提交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();
                        }
                }
        }
于 2014-04-17T23:04:51.130 回答