1

リスト アイテムを作成するための SharePoint SOAP 呼び出しをデバッグするのに非常に苦労しています。送信する SOAP 本文は次のとおりです。

<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/>
   <ns0:Body>
      <ns1:UpdateListItems>
         <ns1:listName>{35BC2CB3-D2FB-4D47-B711-7502819D6E2B}</ns1:listName>
         <ns1:updates>
            <Batch OnError="Continue" ListVersion="1">
               <Method ID="1" Cmd="New">
                  <Field Name="ID">New</Field>
                  <Field Name="Title">Test Summary</Field>
               </Method>
            </Batch>
         </ns1:updates>
      </ns1:UpdateListItems>
   </ns0:Body>
</SOAP-ENV:Envelope>

私が何をしても、詳細として「値が期待される範囲内に収まりません」という SoapServerException が常に返されます。これは、私がフル アクセスできる SharePoint サイトにあります。これは、唯一の必須属性として Title を持つ新しく作成されたリストです。問題が何であるかを理解するにはどうすればよいですか?

FWIW、GetList や GetListItems などの他のメソッドには問題ありません。UpdateListItems を使用して新しいリスト項目を追加することができません。

4

3 に答える 3

3

TLDR:client.options.prettyxml = True最初の update 呼び出しを試みる前に、設定を試してください。

なんてこった、私は一日中明らかに同じ問題に取り組んできました。同様の suds バージョン (ここでは suds_jurko 0.5) を使用していると仮定すると、「これをデバッグするにはどうすればよいですか?」ある程度、ログに記録していました:

import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

「element.plain()」関数が要素が空であると判断する原因となっていた、sax ドキュメント/要素 (またはそれらに隣接する要素) のどこかにバグがあります。client.options.prettyxml が False の場合、SoapClient.send() は str() メソッドの代わりに sax ドキュメントの「plain()」メソッドを使用しようとします。その結果、要素が空として解析され、UpdateListItems が「値が期待される範囲内にありません」というエラーで失敗しました。

元:

MESSAGE:
b'<?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/>
<ns0:Body>
<ns1:UpdateListItems>
  <ns1:listName>B5E50422-D16B-4C5F-AE19-CFBE943C6F3F</ns1:listName>
  <updates/>
</ns1:UpdateListItems>
</ns0:Body>
</SOAP-ENV:Envelope>'

GetListItems() メソッドも「機能した」ことに注意してください。これは、sax がその SOAP 呼び出しに空のクエリ要素を入れていたためで、技術的には問題ありませんでした。

client.options.prettyxml = Trueこれを回避するには、最初のサービスを呼び出す前にどこかに追加して、SoapClient.send() に強制的に「pretty」バージョンを使用させます。

どうやら SOAP オブジェクトが破損する前にチェックしていたようだったので、この障害に気付きませんでした。ロギングをオンにすると、直前の変更が明らかになりました。

(これは古い質問だと思いますが、それが嫌われているかどうかはわかりませんが、以前に実際の問題に最も近いものであり、答えに値すると感じました)

于 2014-01-28T01:26:04.093 に答える
1

私自身もこの問題を抱えていました。

これは私が使用したコードであり、機能しているようです。

batch = Element('Batch').append(Attribute('OnError', 'Return'))
batch.append(Attribute('ListVersion', '1'))

method = Element('Method').append(Attribute('ID', '1'))
method.append(Attribute('Cmd', 'Update'))

method.append(Element('Field').append(Attribute('Name', 'ID')).setText(1))
method.append(Element('Field').append(Attribute('Name', 'Title')).setText('Just Changed It23223'))

batch.append(method)

updates = Element('ns1:updates')
updates.append(batch)

client.service.UpdateListItems('Test', updates)
于 2012-08-23T19:06:41.300 に答える
0

リスト ID が正しいこと、およびフィールドが項目を追加するリストの内部名のみを使用していることを確認してください。

メソッドを try catch ブロック内に配置してみてください。以下のセクションを catch ブロックの上に配置して、例外の詳細を表示します。

catch (soapserver.soapserverexception ex)
{    
     console.writeline(ex.detail.innertext);
}
于 2011-05-05T06:05:58.737 に答える