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