<p>当使用.NET webservices时,可以将soap操作重写添加到调用中。如下所示。确认工作代码。</p>
<pre><code>import SOAPpy
ns = 'http://www.webservicex.net'
url = '%s/WeatherForecast.asmx' % ns
server = SOAPpy.SOAPProxy( url, namespace=ns )
#following is required for .NET
server.config.buildWithNamespacePrefix = 0
#adding the soapaction is required for .NET
print server._sa( '%s/GetWeatherByPlaceName' %ns ).GetWeatherByPlaceName( PlaceName='Dallas' )
print server._sa( '%s/GetWeatherByZipCode' %ns ).GetWeatherByZipCode( ZipCode='33126' )
</code></pre>
<p>有人写了一个<a href="http://osdir.com/ml/python.pywebsvcs.general/2005-12/msg00006.html" rel="nofollow noreferrer">class</a>来做类似的事情。</p>
<p>上述.Net包装的修改版本:</p>
<pre><code>import SOAPpy
class SOAPProxy( SOAPpy.SOAPProxy ):
"""Wrapper class for SOAPpy.SOAPProxy
Designed so it will prepend the namespace to the action in the
SOAPAction HTTP headers.
"""
def __call( self, name, args, kw, ns=None, sa=None, hd=None, ma=None ):
sa = sa or self.soapaction
ns = ns or self.namespace
self.config.buildWithNamespacePrefix = 0
# Only prepend namespace if no soapaction was given.
if ns and not sa:
if ns.endswith( '/' ):
sa = '%s%s' % ( ns , name )
else:
sa = '%s/%s' % ( ns , name )
#fixup boolean args - .net wants lowercase
for arg in kw:
if isinstance( kw[ arg ], types.BooleanType ):
kw[ arg ] = SOAPpy.Types.booleanType( kw[ arg ] )
return SOAPpy.SOAPProxy.__call( self, name, args, kw, ns, sa, hd, ma )
if __name__ == '__main__':
print __doc__
</code></pre>