4

SharePoint 2010 列表 Web 服务 UpdateList 失败并显示“尝试使用已不复存在的对象”...但它确实存在。

我想更新现有字段的属性。出于演示目的,更新描述应该很容易。使用和扩展 haufe.sharepoint 0.1.9,我能够查询/更新项目和删除字段。我有信心在更新和删除期间观察到更改的列表正确地解决了问题。我相信该字段也得到了准确的处理,因为 a) 它可以被删除,并且 b) 如果我更改“名称”或“ID”,错误将变为“未找到具有该名称的字段”。

从 SUDS 转储 SOAP 消息,我可以显示不同的消息和结果。三个测试用例如下所示。首先是失败。第二个显示不匹配的名称会导致不同的错误。第三个显示如何按名称删除字段。

关于下一步去哪里的任何想法?除了能够删除同一字段之外,是否还有更新字段的特殊权限?虽然我是子网站所有者,但我不是 SharePoint 管理员或服务器管理员。因此,查看日志或安装自定义代码是困难的。这就是我使用 Python Web 服务方法的原因。我几乎完全被难住了。

谢谢,罗伯

消息:这应该可以更新“描述”字段,但不能。除了使用字段 ID 之外,我还尝试了 Name、DisplayName 和 StaticName,但均无济于事。MSFT 参考是:http: //msdn.microsoft.com/en-us/library/lists.lists.updatelist%28v=office.12%29.aspx

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field ID="08d8fb05-0de8-4e19-988c-e204ade07f47" Description="new desc"/>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

故障是:

<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</faultstring>
<detail>
<errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Attempted to use an object that has ceased to exist. (Exception from HRESULT: 0x80030102 (STG_E_REVERTED))</errorstring>
<errorcode xmlns="http://schemas.microsoft.com/sharepoint/soap/">0x80030102</errorcode>
</detail>
</soap:Fault>

消息:期望找不到该字段并且没有。基本上,这证明了不正确的名称会导致不同的错误。

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field ID="q08d8fb05-0de8-4e19-988c-e204ade07f47" Description="new desc"/>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

消息:能够像这样删除字段。这只是证明可以以某种方式成功地操纵该领域。

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:deleteFields>
            <Fields>
               <Method ID="3">
                  <Field Name="myText"/>
               </Method>
            </Fields>
         </ns1:deleteFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4

1 回答 1

2

这有效

更新和添加字段取得了进展!“脆弱”是用来描述 Lists.asmx Web 服务的一种方式。值得注意的是,字段属性是顺序相关的;类型需要放在第一位——猜猜微软的代码中可能有一个古怪的“if-tree”。此外,如果仅使用 DisplayName 可能会产生歧义,则需要 DisplayName 后跟 Name。

关键的调试技巧在类似的、添加了 GUI 的字段之后对以编程方式添加的字段进行建模。要发现正确的参数:

  1. 通过 GUI 创建一个类似的字段
  2. 将 suds 日志记录设置为调试级别。
  3. 使用 haufe.sharepoint 的“service = Connector(url, username, password, list_id)”打开列表并检查返回的 SOAP 消息中的字段参数。
  4. 使用这些属性来推动实验,记住某些字段是只读的,或者不适合 Microsoft 定义的外部使用。

以下是更新文本字段、更新计算公式字段、添加文本字段和添加计算字段的四个成功示例。希望这足以让我和其他人继续努力。注意: haufe.sharepoint 不支持这些附加方法或返回结果。所以......需要一些黑客攻击。

更新文本字段

类型必须是第一个属性。使用 DisplayName 后跟 Name 以避免与其他字段产生歧义。

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field Type="Text" Name="myText" DisplayName="myText" Description="new desc"/>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

更新计算字段

类型必须是第一个属性。首先使用 DisplayName,然后使用 Name 以避免与其他字段产生歧义。

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field Type="Calculated" DisplayName="myCalcAdd" Name="myCalcAdd" ResultType="Number" ReadOnly="TRUE">
                     <Formula>=Jan*0.5</Formula>
                     <FormulaDisplayNames>=Jan*0.5</FormulaDisplayNames>
                     <FieldRefs>
                        <FieldRef Name="Jan"/>
                     </FieldRefs>
                  </Field>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

添加文本字段

类型必须放在第一位。DisplayName vs Name 似乎是这两个属性中更重要的一个。

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:newFields>
            <Fields>
               <Method ID="1">
                  <Field Type="Text" Name="myTextAdd" DisplayName="myTextAdd" Description="My first added field"/>
               </Method>
            </Fields>
         </ns1:newFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

添加计算字段

类型必须放在第一位。DisplayName 是必需的,而 Name 不是。至少在以下情况下也需要 ResultType。

<?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/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:newFields>
            <Fields>
               <Method ID="1" AddToView="">
                  <Field Type="Calculated" DisplayName="myCalcAdd" ResultType="Number">
                     <Formula>=Jan*0.5</Formula>
                     <FormulaDisplayNames>=Jan*0.5</FormulaDisplayNames>
                     <FieldRefs>
                        <FieldRef Name="Jan"/>
                     </FieldRefs>
                  </Field>
               </Method>
            </Fields>
         </ns1:newFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
于 2012-11-25T02:28:40.690 回答