列表Web服务UpdateList失败并显示“尝试使用已停止存在的对象”

时间:2012-11-22 23:25:30

标签: python sharepoint-2010 suds

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

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

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

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

谢谢,Rob

消息:这应该可以更新“描述”字段,但不能。除了使用字段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>

1 个答案:

答案 0 :(得分:2)

这有效

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

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

  1. 通过GUI创建一个类似的字段
  2. 将suds日志记录设置为调试级别。
  3. 使用haufe.sharepoint的“service = Connector(url,username,password,list_id)”打开列表,并检查返回的SOAP消息以获取字段的参数。
  4. 使用这些属性来驱动实验,请记住某些字段是只读的,或者不是Microsoft定义的外部用途。
  5. 以下是更新文本字段,更新计算公式字段,添加文本字段以及添加计算字段的四个成功示例。希望这对我和其他人来说已经足够了。注意: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。至少在下面的情况下还需要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>