2009-04-22 2 views
16

日付のみを表すOperationContract(時間コンポーネントまたはタイムゾーン指定子なし)のパラメータの場合、タイムゾーン変換のあいまいさや問題を避けるためにxs:Dateを使用することが望ましいクライアントとサーバーの間。WCF OperationContractパラメータでxs:Dateを生成する方法

現在、WCFはDateTimeパラメータをシリアル化するためのxs:DateTimeのみをサポートしています。

xs:Dateとしてシリアル化されるパラメータでOperationContractを生成する最も簡単な方法は何ですか?

カスタム.NETタイプ「public struct DateOnly」などを標準DateTimeとの間で暗黙的にキャストして、xs:Dateとしてwsdlを自動的に生成すると考えています。

これは可能ですか、それをどうやって実装するのですか?

可能であれば、カスタムタイプでXmlSchemaProviderAttributeを使用して解決する可能性がありますが、この属性で見つかったドキュメントは少し不透明に見えます。

更新

私はそれは難しいそれが解決策を得ることの確率が増加しますが、私は、サイトのアドバイスに従うと恵みを始めようと考えていることを見つけます。

WSとしてシリアル
  • :日付として説明明快のために、恵みのための条件は、WCF OperationContractにパラメータができるようにソリューションを構築するために必要なすべての情報を提供するために、

    です生成されたWSDLのようなものです。

  • は、System.DateTime値であるか、またはDateTimeから暗黙的にキャストすることができます。

+0

https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215でクローズドコネクトの提案が見つかりました。 –

答えて

1

残念ながら、WCFはxs:Date型をサポートしていません。

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

はい私は私自身の構造体を作成する必要があると思ったが、xs:Date(カスタムXMLシリアル化を使用して)としてシリアル化したいのですか?したがって、xs:Dateを認識するWCF以外のクライアントは、さらに別のカスタムタイプを必要としません。 – Joe

+0

私は、その場でWSDLのXMLを変更することを除いて、それを変更する方法は知らない。私はパフォーマンスの意味は分からない。この記事ではあなたの状況を完全には説明していませんが、SOAPメッセージの内容を変更する方法を開始する場合があります。 http://blogs.msdn.com/kaevans/archive/2008/01/08/modify-message-content-with-wcf.aspx – Keith

1

WCFのデファクトシリアライザ(DataContractSerializer)は、それをサポートしていない独自の "DateOnly"構造体を作成する必要があります。しかし、XmlSerializerはそれをサポートしています。

1 - ...

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

2ご契約に[XmlSerializerFormat]属性を追加 - のDataContractのタイプでは、メンバーに[のXmlElement(データ型= "日付")]を追加します。

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

これは

+0

これは、OperationContractの日付パラメータには役立ちません。 – Joe

+1

申し訳ありませんが、私はあなたが簡単なDateTimeパラメータについて話していたことを認識していませんでした。しかし、[XmlSerializerFormat]に切り替えないと、複雑な型に同じ問題はありませんか? – Sylvain

+0

はい、DataMembersとOperationContractパラメータに同じ問題があります。 DataMembersの場合、DataServicesの利点の一部を失っても、XMLシリアル化を使用することで回避することができます。しかし、私はどちらの場合でも動作するソリューションを探しています。マイクロソフトが "v.Next"のために検討している修正を待っています:https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215 – Joe

5

に役立ちます希望は今、これは私の注意に来たことを、私はPlease Fully Support xs:Date for Date-Only Parameters and DataMembersで、接続に新たな提案を作成しました。私は4つの星(重要)でこれを評価しました。

これを読んでいる人は、これが重要である(またはそうでない)場合は、Connectを使用してそれに投票したりコメントしたりしてください。

+0

参考:Connectの提案も4つ星評価しました。 – Sylvain

+0

私は確かにそれが重要だと思います。接続の提案では、 "[XmlSerializationFormat]を使用してデータシリアライザの代わりにXMLシリアライザを使用できることがわかります。これはDataContractsの回避策ですが、私の理解では、運用契約パラメータのXMLセーラライゼーションを指定する方法はありません。このことは正しいのでしょうか?いずれにせよ、元の(クローズド)Connect提案に対するMSの応答は、 "v.Next"(これがV4以降のバージョンを意味するかどうかは不明)を考慮していることを示しています。 – Joe

+0

xmlシリアライザを使用するようにサービス契約、サービス、またはエンドポイント全体を構成することは可能です。どのようにか分かりません。 –

3

オペレーションのパラメータとしてxs:Dateを指定する必要があると指定しました。つまり、そのような要件を指定する正式な方法があります:WSDL。 これを実行していた場合は、WSDL Firstというアプローチを使用します。インタフェースのxs:dateなど、必要なコントラクトを定義するWSDLから始めて、どこにいても構いません。次に、svcutil.exeを使用してサービススタブを生成します。/serializer:xmlSerializerを渡すことを忘れないでください。

3

私はまた、問題が記載されています。私は独自のソリューションを開発しました - WcfDateカスタムタイプ。 WCF Support for xs:date

関連する問題