views:

497

answers:

2

Seeing something strange between a Java web service and the .NET client talking to it. We are sending an object back and forth with a DateTime property on it. Sort of like this (generated from the WSDL):

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://ournamespace.com/")]
public partial class myClass {
    private System.DateTime expirationDateField;
    private string nameField;

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public System.DateTime expirationDate {
        get {
            return this.expirationDateField;
        }
        set {
            this.expirationDateField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

We are receiving the objects with dates just fine, but when we send them back to the Web Service, the expirationDate property was showing up as null. We looked at the raw XML that the Java server was receiving and the tag for expirationDate wasn't there, sort of like this:

<myClass><name>My Name</name></myClass>

(That's not the exact XML, but close enough). I double checked and expirationDate is definitely set on the .NET client before being sent. The XSD for the WSDL doesn't look strange:

<xs:element name="Expiration" type="xs:dateTime" minOccurs="0"/>

We are using the same type for other things, which work fine as well. On the .NET side, we're using the wsdl.exe tool to generate the classes and code.

One more step we could take would be to see the XML that is generated by .NET before it calls the web service, but I don't know how to do that. Any other thoughts or suggestions?

+2  A: 

When a value type is optional in the schema, WSDL.EXE generates a property for the value, and a bool property to indicate whether the value is present or not. You should have an ExpirationSpecified property that needs to be set to true when you want to send the expiration date, and false when you do not.

John Saunders
Son of a... you're right. Man it took way too long to type all that out. Thanks :).
swilliams
A: 

Thanks John,

it helps me in a great deal... took me a long time too to sort that problem..

regards, Jack