Problems getting Python client (SOAPpy) to consume .NET web services

M

Michael Hatmaker

I have begun experimenting with web services, and I created some
simple web services in C# and was able to install them with IIS and
create an equally simple C# client to consume them.

My next experiment was to use Python to consume these same web
services, and even though I am able to get Python to consume web
services from a variety of sources (Apache SOAP, Glue, AXIS), I cannot
get web services created with MS.NET to work. Actually, methods with
no arguments work fine, but any methods that take arguments do not
work. There is no error, it is simply that an incorrect result is
returned (i.e. my simple Add(int a, int b) web service always returns
zero).

I tried playing around with the
[SoapDocumentService(Use=SoapBindingUse.Literal,
ParameterStyle=SoapParameterStyle.Wrapped)] arguments in .NET, but I
have had no success as of yet. I don't think it's just me since I
cannot consume any of the web services on webmethods.net that are
created using MS.NET.

My Python code looks something like this:

from SOAPpy import WSDL
server = WSDL.Proxy('http://localhost/MyWebServices/FirstService.asmx?WSDL')
server.SayHello() # works correctly - just prints a hello message
server.Add(3, 4) # does not work - returns zero

Any tip that would point me in the right direction would be greatly
appreciated!
 
B

Benjamin Niemann

Michael said:
I have begun experimenting with web services, and I created some
simple web services in C# and was able to install them with IIS and
create an equally simple C# client to consume them.

My next experiment was to use Python to consume these same web
services, and even though I am able to get Python to consume web
services from a variety of sources (Apache SOAP, Glue, AXIS), I cannot
get web services created with MS.NET to work. Actually, methods with
no arguments work fine, but any methods that take arguments do not
work. There is no error, it is simply that an incorrect result is
returned (i.e. my simple Add(int a, int b) web service always returns
zero).

I tried playing around with the
[SoapDocumentService(Use=SoapBindingUse.Literal,
ParameterStyle=SoapParameterStyle.Wrapped)] arguments in .NET, but I
have had no success as of yet. I don't think it's just me since I
cannot consume any of the web services on webmethods.net that are
created using MS.NET.

My Python code looks something like this:

from SOAPpy import WSDL
server = WSDL.Proxy('http://localhost/MyWebServices/FirstService.asmx?WSDL')
server.SayHello() # works correctly - just prints a hello message
server.Add(3, 4) # does not work - returns zero

Any tip that would point me in the right direction would be greatly
appreciated!
I tried this some time before, too. Actually cannot remember, if I finally
succeeded. I think using keyword arguments in Python got me one step further, e.g.:
server.Add(a=3, b=4)
 
M

Michael Hatmaker

Nice catch! Actually, I had tried that once, but there is one more
trick to make this work (that I had since added). You must add the
following line in your C# web service (I put it before the
[WebService(Namespace=...] line):

[SoapDocumentService (Use=SoapBindingUse.Encoded)]

(and I also think you need to import the following:)

using System.Web.Services.Protocols;
using System.Web.Services.Description;
using System.Xml.Serialization;

So for anyone else that is having this problem, the solution is the
combination of the two: (1) You must ad the [SoapDocumentService
(Use=SoapBindingUse.Encoded)] line to your web service (along with all
the appropriate "using" statements shown above) and (2) you must
specify the arguments by name in the method call like "server.Add(a=3,
b=5)".

Phew. Thanks again for making me go back and take a look at that named
arguments thing. I still don't know if there is hope for using a .NET
web service that I didn't write (such as those on www.xmethods.net),
but I'll be sure to let everyone know if I find a solution.

Benjamin Niemann said:
Michael said:
I have begun experimenting with web services, and I created some
simple web services in C# and was able to install them with IIS and
create an equally simple C# client to consume them.

My next experiment was to use Python to consume these same web
services, and even though I am able to get Python to consume web
services from a variety of sources (Apache SOAP, Glue, AXIS), I cannot
get web services created with MS.NET to work. Actually, methods with
no arguments work fine, but any methods that take arguments do not
work. There is no error, it is simply that an incorrect result is
returned (i.e. my simple Add(int a, int b) web service always returns
zero).

I tried playing around with the
[SoapDocumentService(Use=SoapBindingUse.Literal,
ParameterStyle=SoapParameterStyle.Wrapped)] arguments in .NET, but I
have had no success as of yet. I don't think it's just me since I
cannot consume any of the web services on webmethods.net that are
created using MS.NET.

My Python code looks something like this:

from SOAPpy import WSDL
server = WSDL.Proxy('http://localhost/MyWebServices/FirstService.asmx?WSDL')
server.SayHello() # works correctly - just prints a hello message
server.Add(3, 4) # does not work - returns zero

Any tip that would point me in the right direction would be greatly
appreciated!
I tried this some time before, too. Actually cannot remember, if I finally
succeeded. I think using keyword arguments in Python got me one step further, e.g.:
server.Add(a=3, b=4)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top