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>
答案 0 :(得分:2)
更新和添加字段的进展! “脆弱”是一种描述Lists.asmx Web服务的方式。值得注意的是,Field属性依赖于顺序;类型需要先来 - 猜测微软的代码中可能有一个古怪的“if-tree”。此外,如果仅使用DisplayName可能存在歧义,则需要DisplayName,后跟Name。
关键的调试技巧在类似的GUI添加字段之后对以编程方式添加的字段进行建模。要发现适当的参数:
以下是更新文本字段,更新计算公式字段,添加文本字段以及添加计算字段的四个成功示例。希望这对我和其他人来说已经足够了。注意: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>