编程语言
首页 > 编程语言> > python – 列表Web服务UpdateList失败,“尝试使用已不再存在的对象”

python – 列表Web服务UpdateList失败,“尝试使用已不再存在的对象”

作者:互联网

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

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

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

关于下一步该去哪儿的想法?除了能够删除相同的字段之外,是否有特殊权限更新字段?虽然我是子网站所有者,但我不是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>

解决方法:

这有效

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

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

>通过GUI创建一个类似的字段
>将suds日志记录设置为调试级别.
>使用haufe.sharepoint的“service = Connector(url,username,password,list_id)”打开列表,并检查返回的SOAP消息以获取字段的参数.
>使用这些属性来驱动实验,记住某些字段是只读的,或者不是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>

添加calc字段

类型必须先到.名称不是需要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>

标签:python,sharepoint-2010,suds
来源: https://codeday.me/bug/20190704/1372891.html