1

我很难调试 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 网站上。这是一个新创建的列表,其中 Title 作为唯一必需的属性。我如何找出问题所在?

FWIW,我对 GetList 和 GetListItems 等其他方法没有任何问题。我只是没有运气使用 UpdateListItems 添加新的列表项。

4

3 回答 3

3

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)

在 sax 文档/元素(或与它们相邻)的某处存在一个错误,导致“element.plain()”函数认为该元素为空。当 client.options.prettyxml 为 False 时,SoapClient.send() 尝试使用 sax Document 的 'plain()' 方法而不是 str() 方法。这样做的结果是元素被解析为空,导致 UpdateListItems 失败并出现“值不在预期范围内”错误。

前任:

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() 方法也对我“有效”,因为 sax 在该 SOAP 调用中放置了一个空查询元素,这在技术上是可以的。

client.options.prettyxml = True要解决此问题,请在调用第一个服务之前通过添加某个位置来强制 SoapClient.send() 使用“漂亮”版本。

我没有注意到这个错误,因为我显然是在我的 SOAP 对象被破坏之前检查它;打开日志记录显示最后一分钟的更改。

(我意识到这是一个老问题,不确定这是否令人不悦;但这是我之前能够找到的最接近我的实际问题的问题,并且觉得它应该得到答案)

于 2014-01-28T01:26:04.093 回答
1

我自己也有这个问题。

这是我使用的代码,它似乎工作:

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)
于 2012-08-23T19:06:41.300 回答
0

请确保您的列表 ID 正确,并且字段仅对您要添加的项目使用内部名称。

尝试将您的方法放在 try catch 块中。将下面的部分放在 catch 块上方以获取有关异常的更多详细信息。

catch (soapserver.soapserverexception ex)
{    
     console.writeline(ex.detail.innertext);
}
于 2011-05-05T06:05:58.737 回答