これらの質問には、いくつかの良い情報があります: How to generate xs:Date in WCF OperationContract parameterおよびBest practice for DateTime serialization in .NET 3.5。
アレックスが質問に対するコメントで述べているように、WCF は型をサポートしていませんxs:date
。DataContractSerializer
ただし、上記の質問は がそれを処理できることを示していますが、デフォルトではそのタイプをサポートしていないと言う方がおそらくより正確ですXmlSerializer
。
反対の比較については、このリンクを参照してください。DataContractSerializer
XmlSerializer
私が実行した場合:
svcutil http://my_web_site?wsdl /ser:XmlSerializer /d:C:\temp
次に、次のような WSDL フラグメント:
<s:complexType name="Contact">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="BirthDate" type="s:date" />
</s:sequence>
</s:complexType>
このクラスは生成されましたか:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public partial class Contact
{
private System.DateTime birthDateField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(DataType="date", Order=0)]
public System.DateTime BirthDate
{
get
{
return this.birthDateField;
}
set
{
this.birthDateField = value;
}
}
}
このsvcutil
呼び出しにより、 と の 2 つのファイルが生成さService1.cs
れますoutput.config
。プロジェクトにコード ファイルを含め、system.serviceModel
ビットを構成ファイル (つまり、web.config または app.config) に追加すると、通常どおりサービスを呼び出すことができます。例えば:
Service1SoapClient client = new Service1SoapClient("Service1Soap");
var contact = client.GetContact();
このアプローチには欠点がないわけではありません。パラメータなしで生成された場合、Service1.cs
ファイルは著しく異なり、、、/ser:XmlSerializer
などの追加のクラスが取得されます。これらのクラスがサービスとの対話において重要である場合、私のアプローチはうまくいかないかもしれません。WebMethodNameRequest
WebMethodNameRequestBody
WebMethodNameReponse
WebMethodNameReponseBody
編集:
null 許容プロパティに関しては、この質問にいくつかの良い情報があります: svcutil.exe - null 許容フィールドを許可しないで生成されたプロキシ
生成されたプロキシ クラスで null 許容のプロパティを取得するにnillable
は、WSDL でフィールドを設定する必要があります。だから、このようなもの:
<s:element minOccurs="0" maxOccurs="1" name="SomeProperty" type="s:date" nillable="true" />
public System.Nullable<System.DateTime> SomeProperty
プロキシ クラスで呼び出されるプロパティを生成します。
ただし、あなたの場合、プロパティを使用して、SomePropertySpecified
プロパティの有無を示すことができます。これらの種類のプロパティは、 がある場合に生成されますminOccurs="0"
。
日付のフォーマットに関しては、よくわかりません。値は、オプションのタイムゾーン情報 ( w3.orgxs:date
)を含む yyyy-mm-dd を意図しています。オラクルが異なる形式の日付を期待している場合、それらがどのように値になるのか疑問に思います。xs:date
利用しようとしているサービスに関して提供できるドキュメントやその他の情報はありますか?
編集2:
「日付はデータベース形式でなければならない」という正確な内容が少しわかりません。オラクルのドキュメントで意味します。タイプが である場合、xs:date
それらをデータベース形式にシリアル化すると、それはもはやxs:date
?ではなくなったことを確実に意味します。
それでも、その点で試してみることがいくつかあります。
この日付ビジネスが物事にどのように影響するかを確認するには、Web サービスにいくつかのクエリを送信して実験する必要があるかもしれません。
それらの*IsSpecified
パラメーターが存在しないと確信していますか? 上記の私のContact
クラスを例として使用するminOccurs=0
には、プロパティで、クラスに という追加のプロパティBirthDate
を与えます。Contact
BirthDateIsSpecified