1

我正在尝试通过 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 的程序员一起为此花了几天时间。根据对查询的各种编辑更改,我们还看到“&lt;Query&gt;查询中的元素丢失或无效”。

顺便说一句,我还通过 Windows 机器上的 Fiddler2 尝试了所有这些 SOAP 调用。我看到与 iOS HTTP 调用相同的结果。

我能得到的最接近的答案是查询格式不正确(duh)。但是对于我的一生来说,正确的格式正在躲避我们。我们已经能够从本地 .Net 应用程序成功地查询服务器,但是将查询 XML 的确切内容和格式复制到 iOS 代码并没有任何改变。

不用说,Microsoft 文档和错误消息在犯罪方面毫无用处。不,我们不能迁移到 MOSS 2010。客户端不会很快更新,所以我们必须使用他们现有的技术。

任何帮助都将不胜感激。即使有人可以明确地证明该特定 Web 服务功能在 2007 年被破坏。虽然它很糟糕,但至少我们会知道我们并不完全愚蠢。但是,如果有人能确定我实际上是错误地格式化了查询并告诉我如何修复它,那将是惊人的。

谢谢。

4

2 回答 2

0

我知道这个问题已经有一年多了,但我猜你错过了一个

<QueryOptions />

内的元素

<queryOptions></queryOptions>

节点。希望至少可以帮助某人:)

于 2014-11-14T15:00:31.440 回答
0

我在 iOS 上使用 SOAP 查询取得了一些成功。它绝对有一个很好的学习曲线。我应该注意,我不是 SP 专家,所以我不一定能解释为什么你的不起作用。这是大量谷歌搜索和(询问 SO)的结果。这是我执行以下操作时的原始 XML GetListItems

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <listName>Notes</listName>
      <query>
       <Query>
        <Where>
         <Or>
          <Eq>
            <FieldRef Name="Title"></FieldRef>
            <Value Type="Text">Chris Test</Value>
          </Eq>
          <Eq>
            <FieldRef Name="Folder"></FieldRef>
            <Value Type="Text">Ungrouped</Value>
          </Eq>
         </Or>
        </Where>
       </Query>
      </query>
      <rowLimit>0</rowLimit>
      <queryOptions>
        <QueryOptions xmlns:ns2="http://schemas.microsoft.com/sharepoint/soap/" xmlns="">
          <IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>
          <ViewAttributes Scope="Recursive" />
        </QueryOptions>
      </queryOptions>
    </GetListItems>
  </soap:Body>
</soap:Envelope>

从名为 notes 的自定义列表中,这将给出标题 == Chris Test OR 文件夹 == 'Ungrouped' 的所有条目

编辑,我看到你有一个 IsNotNull 属性,这就是我这样做的方式:(为简洁起见进行了修剪)

<query><Query>
  <Where>
    <Or>
      <IsNotNull>
        <FieldRef Name="Title"></FieldRef>
      </IsNotNull>
      <Eq>
        <FieldRef Name="Folder"></FieldRef>
        <Value Type="Text">Ungrouped</Value>
      </Eq>
    </Or>
  </Where>
</Query></query>
于 2013-10-04T14:13:21.987 回答