Problem with minOccurs="0" in client WSDL

M

Mike

I have created a web service for a client to consume. The element I am
having trouble with is, as described in their WSDL:

<xsd:element minOccurs="0" ref="LocalData" maxOccurs="1" />

<xsd:element name="LocalData">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Y" />
<xsd:enumeration value="N" />
</xsd:restriction base="xsd:string">
</xsd:simpleType>
</xsd:element>

When I created a class around this it created a LocalDataSpecified bool.
This bool needs to be set in order for my web service to properly handle the
object.

The problem is, is that the client isn't so much "consuming" the web service
in a developement environment like VS.NET 2003, but rather just throwing
SOAP messages at it. So when I get the message LocalData might specified
but the "LocalDataSpecified" flag is not getting set so I can't tell how to
handle it. The value defaults to "Y" because it is declared at the top of
the enumeration.

Is there any attributes I need to set or any thing else in general that I am
missing?

Thanks a lot for your help.

Mike R
 
D

Dilip Krishnan

"LocalDataSpecified" is a technique specfic to .net so the serializer
sets the boolean variable to true ONLY if the Localdata element is found
in the incoming message. So if the Specified is false then the element
dint come in.
I have created a web service for a client to consume. The element I am
having trouble with is, as described in their WSDL:

<xsd:element minOccurs="0" ref="LocalData" maxOccurs="1" />

<xsd:element name="LocalData">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Y" />
<xsd:enumeration value="N" />
</xsd:restriction base="xsd:string">
</xsd:simpleType>
</xsd:element>

When I created a class around this it created a LocalDataSpecified bool.
This bool needs to be set in order for my web service to properly handle the
object.

The problem is, is that the client isn't so much "consuming" the web service
in a developement environment like VS.NET 2003, but rather just throwing
SOAP messages at it. So when I get the message LocalData might specified
but the "LocalDataSpecified" flag is not getting set so I can't tell how to
handle it. The value defaults to "Y" because it is declared at the top of
the enumeration.

Is there any attributes I need to set or any thing else in general that I am
missing?

Thanks a lot for your help.

Mike R

--
HTH
Regards,
Dilip Krishnan
MCAD, MCSD.net
dkrishnan at geniant dot com
http://www.geniant.com
 
M

Mike

That is what I assumed happed. But regardless if I set the element or not
the LocalDataSpecified always comes across as false. The only way I have
been able to get LocalDataSpecified = true is by setting it myself in the
program calling the web service.

Mike
 
D

Dan Rogers

This is a know issue for value types in 1.0 and 1.1 of the .NET framework.

If I understand you, your service will always send this value. If that is
the case, then you can receive your message and then just access the data.
The Specified flag tells you if the data was sent - it is to prevent you
from reading data that is not initialized by the sender.

If you want to make this work as is, and get specified working, make it an
attribute on the service interface. This gets around the known issue.

--------------------
 
M

Mike

Thanks for the response.

The problem I have here is really the client. They cannot make any changes
to their web service because of their development cycle will push the
project back 3 months. I'm having to back my code into a poorly designed
and poorly written web service.

One work around I was looking at doing was to default LocalDataSpecified to
true then add an 'X' value to the top of the LocalData enum. That way
unless they specify 'Y' or 'N' it will default to 'X' so I know they didn't
choose anything. And since they are just pushed raw XML to my web service
instead of calling it from a development environment, this also should be
transparent to them.

Not the best fix but it is all I've come up with. Any other suggestions on
how I can fix this on my side would be appreciated.

Thanks,

Mike R
 
D

Dan Rogers

The other thing you can do on your side is to remove the Specified variable
for this field. That would make it always get serialized.

I'm not clear on whether your program is creating the XML that is a problem
(you need to set the specified flag to true once you set the field.
Properties are perfect for doing this as follows:

[XmlElementAttribute(name="foo")]
public fooEnum foo;
public bool fooSpecified;

[XmlIgnore]
public fooEnum fooProperty
{
get {return foo;}
set { foo = value; fooSpecified=true;}
}

Since you control the proxy you use, you can control all of this code on
this side.

--------------------
 

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

Forum statistics

Threads
473,997
Messages
2,570,241
Members
46,831
Latest member
RusselWill

Latest Threads

Top