Proxy class not reading data returned in SOAP response
Messages   Related Types
This message was discovered on microsoft.public.dotnet.framework.aspnet.webservices.
Responses highlighted in red are from those people who are likely to be able to contribute good, authoratitive information to this discussion. They include Microsoft employees, MVP's and others who IMHO contribute well to these kinds of discussions.
Post a new message to this list...

Jared
I'm trying to create a .NET client to consume a Java web service. The
company that owns the web service does not publish a WSDL, but they do
publish an API document with examples of each supported request and
its corresponding response.

I've manually created a WSDL file based on their examples, and
generated a proxy class using WSDL.EXE. The proxy class appears to
send a valid request because I can see a valid response coming back
using a network sniffer. However, when the proxy class calls
Invoke(), it returns an object[] of the correct length, but with each
element null.

------------------------------------------------------
Here's the SOAP response I'm getting from the server (some data
changed to protect the innocent):

<?xml version="1.0" encoding="UTF-8"?>
<?Some_Company_API version="1.0"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/";
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance";
xmlns:xsd="http://www.w3.org/1999/XMLSchema";>
<SOAP-ENV:Body>
<m:TheResponse xmlns:m="Some API">
<element1 xsi:type="xsd:string">some data</element1>
<element2 xsi:type="xsd:string">some more data</element2>
</m:TheResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
------------------------------------------------------

------------------------------------------------------
Here's the method of the proxy class I'm calling:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Login";,
RequestNamespace="http://tempuri.org/";,
ResponseNamespace="http://tempuri.org/";,
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("element1")]
public string Login(string param1, string param2, string param3, out
string element2) {
object[] results = this.Invoke("Login", new object[] {
     param1,
     param2,
     param3});
element2 = ((string)(results[1]));
return ((string)(results[0]));
}
------------------------------------------------------

If I analyze results[] in breakmode, it has a length of 2, but each
element is null.

Is there something special I need to do to the proxy class to get it
to read the returned data?

TIA

Jared
Reply to this message...
 
    
Dino Chiesa [Microsoft] (VIP)
yes, I think you need to set your RequestNamespace and ResponseNamespace to
"Some API"
not http://tempuri.org.

-Dino

"Jared" <Click here to reveal e-mail address> wrote in message
news:Click here to reveal e-mail address...
[Original message clipped]

rg/Login",
[Original message clipped]

Reply to this message...
 
    
Jared
"Dino Chiesa [Microsoft]" <Click here to reveal e-mail address> wrote in message news:<#Click here to reveal e-mail address>...
[Original message clipped]

Dino,

I've updated the method attributes as shown below. I tried it with
and without setting the "ResponseElementName" param. It still fails
to populate results[], even though I'm still seeing a valid response
with my network sniffer.

----------------------------------------------------
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Login"" target="_blank">http://tempuri.org/Login";,
ResponseElementName="LoginResponse",
RequestNamespace="Some API",
ResponseNamespace="Some API",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("element1")]
public string Login(string param1, string param2, string param3, out
string element2) {
object[] results = this.Invoke("Login", new object[] {
param1,
param2,
param3});
element2 = ((string)(results[1]));
return ((string)(results[0]));
}
----------------------------------------------------

----------------------------------------------------
Is there anything wrong with my class attributes?

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="SomeApiSoap",
Namespace="http://tempuri.org/"" target="_blank">http://tempuri.org/";)]
public class SomeApi :
System.Web.Services.Protocols.SoapHttpClientProtocol {
...
}
----------------------------------------------------

Thanks again,

Jared
Reply to this message...
 
    
Jared Jensen
Click here to reveal e-mail address (Jared) wrote in
news:Click here to reveal e-mail address:

[Original message clipped]

Here's my own answer based on the following post:

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8
&safe=off&threadm=avmXa.5874%24Ye.5664%40fed1read02&rnum=4&prev=/groups%
3Fq%3Dnull%2520%2522SOAP%253A%253ALite%2522%26num%3D30%26hl%3Den%26lr%
3D%26ie%3DUTF-8%26oe%3DUTF-8%26safe%3Doff%26sa%3DN%26tab%3Dwg

(Note that the web service is Perl SOAP::Lite)

-----------------------------------------------------------------
[System.Web.Services.Protocols.SoapDocumentMethodAttribute
("http://tempuri.org/Login"" target="_blank">http://tempuri.org/Login";,
ResponseElementName="LoginResponse",
RequestNamespace="Some API",
ResponseNamespace="Some API",
Use=System.Web.Services.Description.SoapBindingUse.Encoded,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)
]
[return: System.Xml.Serialization.SoapElementAttribute("element1")]
public string Login(string param1, string param2, string param3, out
string element2) {
....
}

The fixes were:

1) Use SoapBindingUse.Encoded instead of Literal
2) Use Serialization.SoapElementAttribute("element1") instead of
XmlElementAttribute("element1")
-----------------------------------------------------------------
Reply to this message...
 
    
Dino Chiesa [Microsoft] (VIP)
Great, glad you were able to solve it. sorry I couldn't be more helpful.
SOAP::Lite is nice but I think its lack of WSDL support means that
development is trickier.

ps: that URL was:
http://tinyurl.com/3ao5b

-Dino

"Jared Jensen" <Click here to reveal e-mail address> wrote in message
news:Xns94D98EAA821AEjaredljensenhotmailc@207.46.248.16...
[Original message clipped]

Reply to this message...
 
 
System.ComponentModel.DesignerCategoryAttribute
System.Diagnostics.DebuggerStepThroughAttribute
System.Web.Services.Description.SoapBindingUse
System.Web.Services.Protocols.SoapDocumentMethodAttribute
System.Web.Services.Protocols.SoapHttpClientProtocol
System.Web.Services.Protocols.SoapParameterStyle
System.Web.Services.WebServiceBindingAttribute
System.Xml.Serialization.SoapElementAttribute
System.Xml.Serialization.XmlElementAttribute




Ad
MBR BootFX
Best-of-breed application framework for .NET projects, developed by Matthew Baxter-Reynolds and MBR IT
 
 Copyright © Matthew Baxter-Reynolds 2001-2008. '.NET 247 Software Development Services' is a trading style of MBR IT Solutions Ltd.
Contact Us - Terms of Use - Privacy Policy - www.dotnet247.com