2009-09-17 6 views
1

Nous essayons de parler à un WebService Java (possible) à partir de .NET 3.5 en utilisant WCF. Le WebService définit un objet Timestamp qui semble être un datetime sans les millisecondes décimales.Consommation Java WebService TimeStamp à partir de .net et WCF

WCF a décidé que .NET utiliserait une donnée comme backing d'objet dans la classe proxy. Lors de l'envoi d'objets avec l'horodatage au Java WebServer, le datetime est sérialisé et inclut les milisecondes. Cela entraîne une erreur. Comment pouvons-nous a) faire en sorte que .NET sélectionne une classe personnalisée que nous implémentons (afin que nous puissions formater le message) ou b) que WCF génère le datetime en fonction des fichiers XSD inclus avec le WSDL?

Problème Définition: Timestamp doit ressembler: 2010-01-01T01: 01: 01-07: 00

Cependant, .NET génère un horodatage avec secondes décimales comme: 2010-01-01T01: 01 : 01.1234-07: 00

Répondre

0

J'ai trouvé quelques façons de gérer ce problème. Les méthodes plus complexes impliquent l'accrochage d'un point de terminaison MessageFormatter personnalisé.

Nous avons trouvé un moyen simple de faire cela.

la fraction de secondes n'est générée que si l'objet datetime en possède.

Ce que nous avons fait:

Nous avons créé un statique sur propertyChange gestionnaire d'événements qui utilise la réflexion pour détecter les types de données datetime. Une fois trouvé, nous recréons le datetime sans les fractions de secondes. Dans notre cas, nous nous foutions des secondes. Nous câblons l'événement dans un constructeur de classe partielle. C'est tout.

Bien sûr

public static class DateTimeSecondCatcher 
{ 
    PropertyInfo dateTimePropertyInfo = sender.GetType().GetProperty(e.PropertyName); 
     if ((dateTimePropertyInfo != null) && (dateTimePropertyInfo.PropertyType == typeof(DateTime))) 
     { 

      DateTime dteValue = (DateTime)dateTimePropertyInfo.GetValue(sender, null); 
      if (dteValue.Millisecond > 0) 
      { 
       dateTimePropertyInfo.SetValue(sender, new DateTime(dteValue.Year,dteValue.Month,dteValue.Day, dteValue.Hour,dteValue.Minute,dteValue.Second,0,dteValue.Kind), null); 
      } 
     } 

} 


// This code goes in the partial class constructor 
this.PropertyChanged += new PropertyChangedEventHandler(DateTimeSecondCatcher.OnPropertyChanged); 
0

Pouvez-vous modifier le code pour le transmettre en tant que chaîne et le formater dans la méthode .ToString() comme indiqué dans l'extrait de code suivant?

SomeTime.ToString("yyyy-MM-ddThh:mm:ss") 
+0

En fait, pour obtenir le décalage horaire à la fin, vous devez faire SomeTime.ToString ("yyyy-MM-JJThh: mm: ssZ")); – Tangurena

0

Par « WCF décidé .NET doit utiliser un datetime », je reçois le sentiment que vous avez utilisé Visual Studio pour ajouter une référence au service Web.

Au lieu de cela, je recommande d'utiliser SvcUtil pour générer un proxy, puis ajoutez cela à votre projet. De cette façon, vous pouvez éditer directement le proxy et le faire se comporter comme vous le souhaitez (par exemple, sérialiser une chaîne plutôt qu'un datetime ou la formater différemment).

Chaque fois que le contrat de service est modifié, vous devez créer un nouveau proxy et fusionner vos modifications, mais il s'agit normalement d'un petit prix à payer pour le contrôle supplémentaire.

+0

Oui, vous avez raison. Nous avons utilisé Visual Studio pour ajouter la référence de service. Nous avons modifié le code généré pour renvoyer une chaîne, mais nous voulions éviter de modifier le proxy chaque fois que le service Web était mis à jour. Nous n'avons aucun contrôle sur le service Web et avons également de nombreux développeurs. Nous obliger à mettre à jour le code à chaque fois ne serait pas la solution idéale, mais ce n'est certainement pas notre premier choix. Est-il possible que le SvcUtil choisisse une classe personnalisée pour l'horodatage au lieu de l'heure de la classe de base? –

+0

@unknown - Je pense que vous manquez le point sur celui-ci. Le point de générer votre propre proxy est de sorte que vous pouvez modifier le proxy, plutôt que d'avoir le SvcUtil le modifier pour vous. – David

+0

Merci pour la réponse. Nous aurons besoin de mettre à jour la référence de service plus qu'un peu, donc j'espérais (vraiment espérer) pour un moyen de forcer le générateur de proxy à créer le proxy correctement la première fois. Nous utilisons actuellement la méthode que vous avez indiquée comme solution de contournement. –

Questions connexes