listData.svc возвращает внутреннюю ошибку сервера 500 - “Ошибка арифметического переполнения ...”
-
29-09-2020 - |
Вопрос
У меня возникли проблемы с некоторыми экземплярами развернутого списка CAML.После развертывания списков они не отображаются в SharePoint Designer.Аналогично, при попытке подключиться к ним (почти ко всем) браузеру возвращается либо внутренняя ошибка сервера 500, либо ответ 404 "не найдено".
Это происходит, когда вы просто тестируете (пустые или заполненные) списки, используя /_vti_bin/listdata.svc/{listname}
.
Содержимое схем списков кажется довольно простым:
Один Поиск -
<Field ID="{Guid}"
Name="TheName"
DisplayName="TheName"
StaticName="TheName"
Type="Lookup"
List="Lists/TheParentList"
ShowField="Title"
Required="TRUE"
Indexed="TRUE"
RelationshipDeleteBehavior="Restrict"/>
Множество текстовых полей (ничего особенного), таких как -
<Field ID="{GUID}"
Name="TheName"
DisplayName="The Name"
StaticName="TheName"
Type="Text"/>
Единственное поле даты и времени -
<Field ID="{GUID}"
Name="TheName"
DisplayName="The Name"
StaticName="TheName"
Type="DateTime"
StorageTZ="UTC"/>
И одно пользовательское поле -
<Field ID="{GUID}"
Name="TheName"
DisplayName="The Name"
StaticName="TheName"
Type="User"
List="UserInfo"
UserSelectionMode="0"/>
Ладно, вот тут-то все и становится странным.Я могу проверить ListData.svc
перед развертыванием, и все работает так, как ожидалось.Если я развертываю wsp, содержащий схемы списков, начинает наблюдаться такое поведение, даже несмотря на то, что все списки загружаются в браузере просто отлично, и все формы работают.Если я затем удалю поля поиска, даты и времени и Пользователя в одном списке И УДАЛИТЕ ВСЕ ОСТАЛЬНЫЕ СПИСКИ пытаясь определить источник методом исключения, я все еще сталкиваюсь с этой проблемой.Итак, чтобы было понятно, на данный момент есть не что иное, как единый список с кучей текстовых полей, и я все еще продолжаю получать плохие ответы с ListData.svc
.
В журналах ULS каждый раз, когда я пытаюсь зайти в службу REST, постоянно возникает ошибка:
System.Data.SqlClient.SqlException: Arithmetic overflow error converting expression to data type int.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.HasMoreRows()
at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
at Microsoft.SharePoint.SPSqlClient.ExecuteQueryInternal(Boolean retryfordeadlock)
at Microsoft.SharePoint.SPSqlClient.ExecuteQuery(Boolean retryfordeadlock)
Хорошо, итак, что же он пытается использовать в качестве int?
Есть ли у кого-нибудь какое-нибудь представление о том, что это может быть?Я прочесал самые дальние уголки Интернета, пытаясь разобраться в этом.
Тем временем я собираюсь продолжить "процесс исключения".
Решение
И я понял это:Тот самый ListTemplate
элемент Type
значение атрибута было причиной проблемы.
Тот самый Документация состояния:
Имейте в виду, что продукты корпорации Microsoft, созданные на базе SharePoint Foundation, такие как Microsoft SharePoint Server, могут определять и определяют дополнительные типы списков.Кроме того, на фермах Microsoft SharePoint Foundation, где развернуто ваше решение, могут создаваться пользовательские типы списков, например, путем добавления элемента CAML ListTemplate (шаблон списка) к компоненту или к ONET.xml файл пользовательской конфигурации определения сайта.(Такие пользовательские типы списков должны иметь значения ID выше 10000, чтобы гарантировать, что они не конфликтуют с номерами, которые будут использоваться Корпорацией Майкрософт в будущих версиях SharePoint Foundation.) Поскольку эти типы списков не имеют соответствующих значений в этом перечислении, вам следует рассмотреть возможность не использовать это перечисление в качестве значения параметра в ваших пользовательских методах.Вместо этого рассмотрите возможность использования параметров String или Int32, которые принимают идентификатор типа списка как string или integer.
Что ж, просто будьте осторожны и не поднимайтесь слишком высоко, выше 10 000.Мои номера состояли из 8 цифр, имели 6-значный префикс, а затем цифровой счетчик (все еще, конечно, ниже, чем у любого C # Int32.MaxValue
или SQL-х int
верхний диапазон).Я снизил их до чуть более 10 000, и проблема разрешилась сама собой.Ах, SharePoint.