<p>您使用的是<code>in_protocol=HttpRpc</code>,而不是<code>in_protocol=Soap11</code>。在</p>
<p><a href="http://spyne.io/docs/2.9/reference/protocol/http.html#spyne.protocol.http.HttpRpc" rel="nofollow">^{<cd3>} protocol</a>简单地定义为:</p>
<blockquote>
<p>The so-called ReST-ish HttpRpc protocol implementation.</p>
</blockquote>
<p>虽然还不完全清楚这意味着什么,但可以肯定的是,<em>不会试图解析soap1.1消息来查找命令,因为这离REST-ish还不远。在</p>
<hr/>
<p>克服了这一点,并给出了更新的(正确的)示例:</p>
<p>它被解析为有效的XML,并且位于有效的soap1.1信封中。在</p>
<p>但它仍然不是好肥皂。主体的内容没有名称空间,也不是带参数的结构化对象。事实上,整个内容是一个通用的XML树,<em>实际的</em>内容是另一个通用XML树,它作为外部树中节点的属性以转义形式存储。在</p>
<p>从您的一个示例的外观来看,我猜URL路径总是<code>/</code>,而SOAP结构始终只是SOAP信封中的一个<code>Notify</code>。当然,如果您对框架进行了足够的斗争,您可能可以让它在<code>Notify</code>上分派,但是无论如何,您的所有消息都将在同一个位置结束,所以…为什么要麻烦呢?如果有的话,您可能希望分派的对象是嵌入XML中的内容,比如<code>NotificationType</code>。在</p>
<p>如果这些猜测是正确的,那么就选择您知道如何使用的最熟悉的web服务器,您甚至不需要WSGI;如果您愿意的话,只需为<code>http.server.HTTPServer</code>编写一个简单的处理程序,并将每个消息路由到同一个代码,这只需进行足够的解析,就可以到达<code>NotificationEvent</code>对象并从中进行分派。像这样:</p>
<pre><code>from xml.etree import ElementTree as ET
def handle_location(nevent):
clocation = nevent.find('ComputerLocation')
changed_on = clocation.attrib['changedOn']
location = clocation.text
# do something with this info
def handle_other_thing(nevent):
# whatever
handlers = {'Location': handle_location,
'OtherThing': handle_other_thing }
et = ET.fromstring(body)
for notification in et.iter('notification'):
message = ET.fromstring(notification.attrib['message'])
for nevent in message.iter('NotificationEvent'):
ntype = nevent.attrib['NotificationType']
handlers[ntype](nevent)
</code></pre>
<p>听起来您可能在<code>NotificationEvent</code>中为最低级别的字段提供了WSDL,因此一旦到达该级别,您就可以使用<code>suds</code>来代替手动解析etree,前提是这样可以使您的生活更轻松或使代码更灵活。在</p>
<p>当然,您还需要添加一些错误处理。在</p>