Как отладить ошибку при создании элемента списка в SharePoint через API-интерфейс UpdateListItems? - PullRequest
1 голос
/ 05 мая 2011

Мне очень тяжело отлаживать вызов SharePoint SOAP для создания элемента списка. Тело SOAP, которое я отправляю:

<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns0:Body>
      <ns1:UpdateListItems>
         <ns1:listName>{35BC2CB3-D2FB-4D47-B711-7502819D6E2B}</ns1:listName>
         <ns1:updates>
            <Batch OnError="Continue" ListVersion="1">
               <Method ID="1" Cmd="New">
                  <Field Name="ID">New</Field>
                  <Field Name="Title">Test Summary</Field>
               </Method>
            </Batch>
         </ns1:updates>
      </ns1:UpdateListItems>
   </ns0:Body>
</SOAP-ENV:Envelope>

Независимо от того, что я делаю, я всегда получаю исключение SoapServerException со значением «Значение не попадает в ожидаемый диапазон», как деталь. Это на сайте SharePoint, к которому у меня есть полный доступ. Это недавно созданный список с заголовком в качестве единственного обязательного атрибута. Как мне выяснить, в чем проблема?

FWIW, у меня нет проблем с другими методами, такими как GetList и GetListItems. Мне просто не повезло, используя UpdateListItems, чтобы добавить новый элемент списка.

Ответы [ 3 ]

3 голосов
/ 28 января 2014

TLDR: попробуйте установить client.options.prettyxml = True до того, как вы попробуете первый вызов для обновления.

Черт возьми, я боролся с явно идентичной проблемой в течение целого дня.Предполагая, что вы использовали аналогичную версию suds (suds_jurko 0.5 здесь), ответ на вопрос "как мне лучше отладить это?"до некоторой степени записывал в журнал:

import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

Существует ошибка, расположенная где-то в саксофонном документе / элементах (или рядом с ними), из-за которой функция element.plain () думала об элементебыл пуст.Когда client.options.prettyxml имеет значение False, SoapClient.send () пытается использовать метод plain () саксофона Document вместо метода str ().В результате элемент был проанализирован как пустой, что привело к сбою UpdateListItems с ошибкой «Значение не попадает в ожидаемый диапазон».

ex:

MESSAGE:
b'<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:UpdateListItems>
  <ns1:listName>B5E50422-D16B-4C5F-AE19-CFBE943C6F3F</ns1:listName>
  <updates/>
</ns1:UpdateListItems>
</ns0:Body>
</SOAP-ENV:Envelope>'

Обратите внимание, что методы GetListItems () также «работали» на меня, потому что саксофон помещал пустой элемент запроса в этот вызов SOAP, что было технически хорошо.

Чтобы обойти это, принудительно вызовите SoapClient.send () использовать «симпатичную» версию, добавив client.options.prettyxml = True где-то перед тем, как вы вызовете свой первый сервис.

Я не заметил ошибки, потому что я, очевидно, проверял свой объект SOAP до того, как он был поврежден;включение записи в журнал показало изменение в последнюю минуту.

(я понимаю, что это старый вопрос, не уверен, что его осудили; но это было самое близкое, что я смог найти к моей настоящей проблеме ранее и почувствовал еезаслужил ответ)

1 голос
/ 23 августа 2012

У меня была эта проблема сама.

Это код, который я использовал, и, кажется, он работает:

batch = Element('Batch').append(Attribute('OnError', 'Return'))
batch.append(Attribute('ListVersion', '1'))

method = Element('Method').append(Attribute('ID', '1'))
method.append(Attribute('Cmd', 'Update'))

method.append(Element('Field').append(Attribute('Name', 'ID')).setText(1))
method.append(Element('Field').append(Attribute('Name', 'Title')).setText('Just Changed It23223'))

batch.append(method)

updates = Element('ns1:updates')
updates.append(batch)

client.service.UpdateListItems('Test', updates)
0 голосов
/ 05 мая 2011

Убедитесь, что идентификатор списка указан правильно, и поля используют внутренние имена только для списка, в который вы добавляете элемент.

Попробуйте поместить свой метод в блок try catch.Поместите ниже раздел над блоком catch, чтобы получить дополнительную информацию для исключения.

catch (soapserver.soapserverexception ex)
{    
     console.writeline(ex.detail.innertext);
}
...