我正在尝试通过 iOS HTTP 调用访问 Sharepoint 2007 Web 服务。通信协议是 SOAP(1 和 1.2)。我能够成功执行 GetList 和 GetListAndView。但是,当我尝试 GetListItems 时,我会收到任意数量的错误消息,这些都没有任何意义。
GetListItems 的 SOAP 调用格式(本例中为 1.2;但 1.0 也存在同样的问题)如下:
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>TaskListSample2-0</listName>
<viewName>{13C5392C-7DBC-4803-A3B8-B377D8566A55}</viewName>
<query><Query><Where><Or><Eq><FieldRef Name="Title"></FieldRef><Value Type="Text">Test</Value></Eq><IsNotNull><FieldRef Name="Title"></FieldRef></IsNotNull></Or></Where></Query></query>
<viewFields><ViewFields><FieldRef Name="Title" /><FieldRef Name="Status" /></ViewFields></viewFields>
<rowLimit>100</rowLimit>
<queryOptions></queryOptions>
<webID>c069106a-8d18-43d6-81c2-2687f568a3c5</webID>
</GetListItems>
</soap12:Body>
</soap12:Envelope>
其间内容的结构与<Query>...</Query>
在成功调用此函数的 .Net 中所格式化的内容完全相同。
我收到以下错误消息:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Receiver</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</soap:Text>
</soap:Reason>
<detail>
<errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Root element is missing.</errorstring>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
我和其他几个精通 .Net 和 Sharepoint 的程序员一起为此花了几天时间。根据对查询的各种编辑更改,我们还看到“<Query>
查询中的元素丢失或无效”。
顺便说一句,我还通过 Windows 机器上的 Fiddler2 尝试了所有这些 SOAP 调用。我看到与 iOS HTTP 调用相同的结果。
我能得到的最接近的答案是查询格式不正确(duh)。但是对于我的一生来说,正确的格式正在躲避我们。我们已经能够从本地 .Net 应用程序成功地查询服务器,但是将查询 XML 的确切内容和格式复制到 iOS 代码并没有任何改变。
不用说,Microsoft 文档和错误消息在犯罪方面毫无用处。不,我们不能迁移到 MOSS 2010。客户端不会很快更新,所以我们必须使用他们现有的技术。
任何帮助都将不胜感激。即使有人可以明确地证明该特定 Web 服务功能在 2007 年被破坏。虽然它很糟糕,但至少我们会知道我们并不完全愚蠢。但是,如果有人能确定我实际上是错误地格式化了查询并告诉我如何修复它,那将是惊人的。
谢谢。