2009-04-22 10 views
16

Pour les paramètres d'un OperationContrat qui représentent une date uniquement (pas de composant temporel ou de désignation de fuseau horaire), il est préférable d'utiliser xs: Date pour éviter toute ambiguïté ou problème de conversion de fuseau horaire entre le client et le serveur.Comment générer xs: Date dans WCF Paramètre OperationContract

Actuellement, WCF ne prend en charge que xs: DateTime pour la sérialisation des paramètres DateTime.

Quelle est la manière la plus simple de générer un contrat d'opération avec un paramètre qui sera sérialisé en tant que xs: Date? Je pense avoir un type .NET personnalisé "struct struct DateOnly" ou similaire, avec un casting implicite vers/à partir d'un DateTime standard, qui génèrera en quelque sorte automatiquement wsdl en tant que xs: Date. Est-ce possible, et comment procéder pour l'implémenter? Si c'est possible, je suppose que la solution pourrait impliquer l'utilisation de XmlSchemaProviderAttribute sur le type personnalisé, mais toute la documentation que j'ai trouvée sur cet attribut semble un peu opaque.

Mise à jour

Il me semble difficile de croire qu'il va augmenter la probabilite d'obtenir une solution, mais je vais suivre les conseils du site et de commencer une prime.

Par souci de clarté, la condition de la prime est de fournir toutes les informations nécessaires pour construire une solution pour qu'un paramètre à un OperationContract WCF peut être:

  • sérialisé ws: Date et décrit comme tel dans le WSDL généré.

  • est une valeur System.DateTime ou peut être transtypée implicitement vers/depuis DateTime.

+0

J'ai trouvé une suggestion de connexion fermée à ce sujet à l'adresse https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215. –

Répondre

1

Malheureusement, WCF ne prend pas en charge le type xs: Date. Il faudrait créer votre propre "DATEONLY" struct, comme:

<DataContract()> _ 
public struct DateOnly 
    <DataMember()> public Month as Integer 
    <DataMember()> public Day as Integer 
    <DataMember()> public Year as Integer 
end struct 
+0

Oui, je pensais que je devrais créer ma propre structure, mais je veux la faire sérialiser en tant que xs: Date (en utilisant la sérialisation XML personnalisée)? Ainsi, les clients non-WCF qui reconnaissent xs: Date n'ont pas besoin d'un autre type personnalisé. – Joe

+0

Je ne suis pas au courant d'un moyen de changer cela, sauf pour modifier le code XML du WSDL à la volée. Je ne suis pas sûr des implications de performance si. Cet article ne traite pas complètement votre situation mais peut vous aider à modifier le contenu du message SOAP. http://blogs.msdn.com/kaevans/archive/2008/01/08/modify-message-content-with-wcf.aspx – Keith

1

de WCF de defaut sérialiseur (DataContractSerializer) ne supporte pas. Mais XmlSerializer le supporte.

1 - Ajouter le [XmlSerializerFormat] attribut à votre contrat ...

[XmlSerializerFormat] 
[ServiceContract] 
public interface IMyContract 
{ 
    MyType GetData(); 
} 

2 - Dans le type DataContract, ajoutez le [XmlElement (DataType = "date")] au membre.

public class MyType 
{ 
    [XmlElement(DataType = "date")] 
    public DateTime BirthDate {get; set;} 
} 

Hope this helps

+0

Cela n'aide pas pour les paramètres de date d'un OperationContract. – Joe

+1

Je suis désolé, je ne savais pas que vous parliez de paramètre DateTime simple. Mais n'auriez-vous pas le même problème avec vos types complexes si vous ne passez pas à [XmlSerializerFormat]? – Sylvain

+0

Oui, le même problème existe pour DataMembers et pour les paramètres OperationContract. Pour DataMembers, l'utilisation de la sérialisation XML est une solution de contournement (même si elle perd certains des avantages de DataContracts). Mais je suis à la recherche d'une solution qui fonctionne dans les deux cas, en attendant le correctif que Microsoft envisage pour "v.Next": https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215 – Joe

5

Maintenant que cela est venu à mon attention, j'ai créé une nouvelle suggestion dans Connect, à Please Fully Support xs:Date for Date-Only Parameters and DataMembers. J'ai noté cela avec quatre étoiles (important).

Si quelqu'un qui lit ceci estime que c'est important (ou n'est pas d'accord), alors utilisez Connect pour voter ou commenter.

+0

FYI: J'ai également évalué votre suggestion de connexion 4 étoiles. – Sylvain

+0

Je pense certainement que c'est important. Dans votre suggestion de connexion, vous indiquez que "Je sais que l'on peut utiliser [XmlSerializationFormat] pour que le sérialiseur XML soit utilisé à la place du Serializer de contrat de données". Bien que ce soit une solution de contournement pour DataContracts, je crois comprendre qu'il n'y a pas moyen de spécifier la sérialisation XML pour les paramètres de contrat d'opération. Cette compréhension est-elle correcte? Dans tous les cas, la réponse MS à la suggestion Connect (fermée) d'origine indique qu'ils envisagent cela pour "v.Next" (pas sûr si cela signifie V4 ou la version suivante). – Joe

+0

Je crois qu'il est possible de configurer l'ensemble du contrat de service, du service ou du point de terminaison pour utiliser le sérialiseur xml. Pas tout à fait sûr comment. –

3

Vous avez spécifié une exigence pour avoir xs: Date en tant que paramètre dans l'opération. La chose est, il y a un moyen formel de spécifier de telles exigences: WSDL. Si je faisais ceci, j'utiliserais une approche WSDL First. Commencez avec un WSDL qui définit le contrat que vous voulez, y compris une xs: date dans l'interface, où que vous le vouliez. Générez ensuite le talon de service à l'aide de svcutil.exe. N'oubliez pas de transmettre/serializer: xmlSerializer.

3

J'ai également décrit le problème. J'ai développé ma propre solution - type personnalisé WcfDate. Il est publié ici: WCF Support for xs:date

Questions connexes