2009-03-24 5 views
1

Voyant quelque chose d'étrange entre un service Web Java et le client .NET qui lui parle. Nous envoyons un objet en arrière avec une propriété DateTime dessus. Un peu comme ceci (généré à partir du WSDL):Webservice Java et client .NET supprimant des objets DateTime

[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; 
     } 
    } 
} 

Nous recevons les objets avec des dates très bien, mais quand nous les renvoyons au service Web, la propriété expirationDate montrait comme null. Nous avons examiné les données XML brutes que le serveur Java recevait et l'étiquette pour expirationDate était pas là, un peu comme ceci:

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

(Ce n'est pas le XML exact, mais assez proche). J'ai vérifié et expirationDate est définitivement défini sur le client .NET avant d'être envoyé. Le XSD pour le WSDL ne semble pas étrange:

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

Nous utilisons le même type pour d'autres choses qui fonctionnent bien aussi. Du côté .NET, nous utilisons l'outil wsdl.exe pour générer les classes et le code. Un autre pas que nous pourrions faire serait de voir le XML qui est généré par .NET avant d'appeler le service web, mais je ne sais pas comment faire cela. D'autres idées ou suggestions?

Répondre

4

Lorsqu'un type de valeur est facultatif dans le schéma, WSDL.EXE génère une propriété pour la valeur et une propriété bool pour indiquer si la valeur est présente ou non. Vous devez avoir une propriété ExpirationSpecified qui doit être définie sur true lorsque vous souhaitez envoyer la date d'expiration et false lorsque vous ne le faites pas.

+1

Fils d'un ... vous avez raison. Man, il a fallu trop de temps pour taper tout ça. Merci :). – swilliams

1

En plus de la réponse de John que j'accepte comme solution, je voudrais indiquer le mécanisme complet. Cela se produit chaque fois qu'un type java "nullable" qui correspond à un type C# "non nullable" est utilisé en tant que propriété de type d'objet de service Web. Par exemple, si des types de wrapper primitifs dans Java tels que "Integer", "Boolean" sont utilisés, ces types correspondent à int, bool qui ne sont pas Nullable. Ainsi, les propriétés "* Spécifiées" doivent être définies afin de les envoyer.

Pour la documentation originale, vous pouvez consulter:
http://msdn.microsoft.com/en-us/library/exchange/bb402199%28v=exchg.140%29.aspx

Questions connexes