谢谢让我们注意到这个!我们能够在今天推出的版本中包含对此的修复。只需使用 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();
}
}
}