Ошибка в C# SDK при выполнении POST

Я использую C# SDK, и кажется, что есть ошибка при выполнении любого POST. Тело сообщения сериализуется в виде строки "System.IO.StringReader". Кажется, это из-за строки 127 в Internal/Http/DefaultHttpClient.cs

Я изменил код с:

restRequest.AddParameter("application/json", smartsheetRequest.Entity.GetContent(),ParameterType.RequestBody);

чтобы:

restRequest.AddParameter("application/json", smartsheetRequest.Entity.GetContent().ReadToEnd(),ParameterType.RequestBody);

и, кажется, решить проблему. Может ли кто-нибудь из Smartsheet проверить и подтвердить, пожалуйста?

Спасибо

1 ответ

Решение

Спасибо, что сообщили нам об этом! Мы смогли включить это исправление в выпуск, который мы выпустили сегодня. Просто обновите ваш пакет с помощью NuGet или загрузите последний исходный код с Github.

Список изменений для этого выпуска:

  • Исправлена ​​проблема с почтовыми запросами, когда тело контента не обрабатывалось правильно.
  • Добавлен индекс в класс ColumnToSheetBuilder.
  • Добавлено имя файла при загрузке вложения.

Технические детали

Эта проблема появилась 17 марта, за два дня до того, как мы выпустили версию 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, а не ToString() StreamReader.

Решение, которое вы упомянули об использовании ReadToEnd() в StreamReader, было хорошим, за исключением того, что оно не обрабатывает двоичные данные. Мы внедрили это изменение, используя GetBinaryContent() метод. Затем мы преобразовали его в байтовый массив с помощью Util.ReadAllBytes(...),

Точные изменения перечислены ниже в формате diff:

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();
                        }
                }
        }
Другие вопросы по тегам