2009-04-22 7 views
16

Für Parameter zu einem OperationContract, die nur ein Datum darstellen (keine Zeitkomponente oder Zeitzonenbezeichner), ist es wünschenswert, xs: Date zu verwenden, um Mehrdeutigkeiten oder Probleme mit der Zeitzonenumwandlung zu vermeiden zwischen Client und Server.So generieren Sie xs: Datum in WCF OperationContract Parameter

WCF unterstützt derzeit nur xs: DateTime zum Serialisieren von DateTime-Parametern.

Was ist der einfachste Weg, um einen OperationContract mit einem Parameter zu erzeugen, der als xs: Date serialisiert wird?

Ich denke über eine benutzerdefinierte .NET-Typ "public struct DateOnly" oder ähnliches, mit impliziten Casting zu/von einem Standard-DateTime, die irgendwie automatisch generieren wsdl als xs: Datum.

Ist das möglich und wie würde ich es implementieren?

Wenn es möglich ist, vermute ich, dass die Lösung möglicherweise XmlSchemaProviderAttribute für den benutzerdefinierten Typ verwenden, aber jede Dokumentation, die ich für dieses Attribut gefunden habe, scheint ein bisschen undurchsichtig.

aktualisieren

Ich finde es schwierig, es zu glauben, dass die probablity des Erhaltens einer Lösung zu erhöhen, aber ich werde die Website der Rat folgen und eine Prämie beginnen.

Aus Gründen der Klarheit, die Bedingung für die Prämie ist notwendig, alle Informationen, um eine Lösung zu konstruieren, so dass ein Parameter auf einen WCF Operation sein kann:

  • serialisiert als ws: Datum und beschrieben als so in der generierten WSDL.

  • ist entweder ein System.DateTime-Wert oder kann implizit in/aus DateTime umgewandelt werden.

+0

Ich fand einen geschlossenen Connect-Vorschlag zu diesem unter https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215. –

Antwort

1

Leider unterstützt WCF den xs: Date-Typ nicht. Sie müssten Ihre eigene "DateOnly" struct erstellen, wie:

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

Ja, ich dachte, ich müsste meine eigene Struktur erstellen, aber ich möchte sie als xs: Date serialisieren (mit benutzerdefinierter XML-Serialisierung)? Daher benötigen Nicht-WCF-Clients, die xs: Date erkennen, keinen weiteren benutzerdefinierten Typ. – Joe

+0

Ich bin mir nicht bewusst, wie ich das ändern könnte, außer dass ich das XML der WSDL im laufenden Betrieb ändere. Ich bin mir der Auswirkungen auf die Leistung nicht sicher. Dieser Artikel befasst sich nicht vollständig mit Ihrer Situation, kann jedoch möglicherweise dazu führen, dass Sie den SOAP-Nachrichteninhalt ändern. http://blogs.msdn.com/kaevans/archive/2008/01/08/modify-message-content-with-wcf.aspx – Keith

1

WCF defaut Serializer (DataContractSerializer) nicht unterstützt. Aber XmlSerializer unterstützt es.

1 - Fügen Sie die [XmlSerializerFormat] Attribut zu Ihrem Vertrag ...

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

2 - In der Datacontract Typ, fügen Sie die [XmlElement (data-type = "date")] mit dem Element.

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

hoffte, das hilft

+0

Dies hilft nicht für Datumsparameter zu einem OperationContract. – Joe

+1

Es tut mir leid, ich wusste nicht, dass Sie über den einfachen DateTime-Parameter sprechen. Aber haben Sie nicht dasselbe Problem mit Ihren komplexen Typen, wenn Sie nicht zu [XmlSerializerFormat] wechseln? – Sylvain

+0

Ja, das gleiche Problem existiert für DataMembers und für OperationContract-Parameter. Für DataMembers ist die Verwendung der XML-Serialisierung eine Umgehung (auch wenn einige der Vorteile von DataContracts verloren gehen). Aber ich suche nach einer Lösung, die in beiden Fällen funktioniert, in Erwartung des Fixes, das Microsoft für "v.Next" erwägt: https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215 – Joe

5

Nun, da dies zu meiner Aufmerksamkeit gekommen ist, ich habe einen neuen Vorschlag in Verbindung geschaffen, bei Please Fully Support xs:Date for Date-Only Parameters and DataMembers. Ich bewerte das mit vier Sternen (wichtig).

Wenn dies jemand als wichtig empfindet (oder auch nicht zustimmt), verwenden Sie bitte Connect, um darüber abzustimmen oder zu kommentieren.

+0

FYI: Ich habe Ihren Connect-Vorschlag auch 4 Sterne bewertet. – Sylvain

+0

Ich denke, es ist wichtig. In Ihrem Verbindungsvorschlag geben Sie an, dass "ich weiß, dass man [XmlSerializationFormat] verwenden kann, um den XML-Serializer anstelle des Data Contract Serializers zu verwenden". Obwohl dies eine Problemumgehung für DataContracts ist, verstehe ich, dass es keine Möglichkeit gibt, XML-Serailization für Operationsvertragsparameter anzugeben. Ist dieses Verständnis korrekt? In jedem Fall gibt die MS-Antwort auf den ursprünglichen (geschlossenen) Connect-Vorschlag an, dass sie dies für "v.Next" in Betracht ziehen (nicht sicher, ob dies V4 oder die folgende Version bedeutet). – Joe

+0

Ich glaube, es ist möglich, den gesamten Servicevertrag, Service oder Endpunkt für die Verwendung des XML-Serialisierers zu konfigurieren. Nicht ganz sicher wie. –

3

Sie haben eine Anforderung angegeben, dass xs: Date als Parameter in der Operation verwendet werden soll. Die Sache ist, es gibt eine formale Möglichkeit, solche Anforderungen zu spezifizieren: WSDL. Wenn ich dies tun würde, würde ich einen WSDL First Ansatz verwenden. Beginnen Sie mit einer WSDL, die den gewünschten Vertrag definiert, einschließlich eines xs: date in der Schnittstelle, wo auch immer Sie es haben möchten. Generieren Sie dann den Dienst-Stub mit svcutil.exe. Denken Sie daran,/serializer: xmlSerializer übergeben.

3

Ich habe auch Problem beschrieben. Ich habe meine eigene Lösung entwickelt - WcfDate benutzerdefinierter Typ. Es ist hier veröffentlicht: WCF Support for xs:date

Verwandte Themen