私は現在インフラストラクチャの一部をWCFに変更しており、この未解決の問題に遭遇し、試してみることにしました。 :)
WCFがDateTime
とDateTimeOffset
をシリアル化する方法はちょっと変わったようです。他のプラットフォームを使用する際は、次のサンプルが示すように、DateTime
使用すると、より良いオプションのようになります。
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
[ServiceContract]
public class DateTimeOffsetService
{
[OperationContract]
public Container DoWork()
{
return new Container
{
NowDateTime = DateTime.Now,
UtcNowDateTime = DateTime.UtcNow,
NowDateTimeOffset = DateTimeOffset.Now,
UtcNowDateTimeOffset = DateTimeOffset.UtcNow
};
}
}
[DataContract]
public class Container
{
[DataMember]
public DateTime NowDateTime { get; set; }
[DataMember]
public DateTime UtcNowDateTime { get; set; }
[DataMember]
public DateTimeOffset NowDateTimeOffset { get; set; }
[DataMember]
public DateTimeOffset UtcNowDateTimeOffset { get; set; }
}
リクエストの応答XMLは次のとおりです。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<DoWorkResponse xmlns="http://tempuri.org/">
<DoWorkResult xmlns:a="http://schemas.datacontract.org/2004/07/RD.MES.WcfService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:NowDateTime>2012-03-23T15:59:47.8328698+01:00</a:NowDateTime>
<a:NowDateTimeOffset xmlns:b="http://schemas.datacontract.org/2004/07/System">
<b:DateTime>2012-03-23T14:59:47.8328698Z</b:DateTime>
<b:OffsetMinutes>60</b:OffsetMinutes>
</a:NowDateTimeOffset>
<a:UtcNowDateTime>2012-03-23T14:59:47.8328698Z</a:UtcNowDateTime>
<a:UtcNowDateTimeOffset xmlns:b="http://schemas.datacontract.org/2004/07/System">
<b:DateTime>2012-03-23T14:59:47.8328698Z</b:DateTime>
<b:OffsetMinutes>0</b:OffsetMinutes>
</a:UtcNowDateTimeOffset>
</DoWorkResult>
</DoWorkResponse>
</s:Body>
</s:Envelope>
私はGMT + 01.00のタイムゾーンにいますよ、値はほぼ正しいようです。それはなぜこの方法ですか?だから、基本的には、DateTime
が正しいタイムゾーンを持っていた(標準xs:dateTime
としてシリアライズされ
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System">
<xs:import schemaLocation="http://localhost:3608/DateTimeOffsetService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xs:complexType name="DateTimeOffset">
<xs:annotation>
<xs:appinfo>
<IsValueType>true</IsValueType>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:element name="DateTime" type="xs:dateTime"/>
<xs:element name="OffsetMinutes" type="xs:short"/>
</xs:sequence>
</xs:complexType>
<xs:element name="DateTimeOffset" nillable="true" type="tns:DateTimeOffset"/>
</xs:schema>
: - - WSDLのように定義されて
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/WcfService">
<xs:import schemaLocation="http://localhost:3608/DateTimeOffsetService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/System"/>
<xs:complexType name="Container">
<xs:sequence>
<xs:element minOccurs="0" name="NowDateTime" type="xs:dateTime"/>
<xs:element minOccurs="0" name="NowDateTimeOffset" type="q1:DateTimeOffset"/>
<xs:element minOccurs="0" name="UtcNowDateTime" type="xs:dateTime"/>
<xs:element minOccurs="0" name="UtcNowDateTimeOffset" type="q2:DateTimeOffset"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Container" nillable="true" type="tns:Container"/>
</xs:schema>
そしてDateTimeOffset
:まあ、WSDLは、このようなContainer
を定義しますコンポーネント)とDateTimeOffset
は、呼び出し元が理解して正しく処理しなければならない非標準複合型にシリアル化されます。
FWIW;私はこれを見つけたので、実際に別のタイムゾーンオフセットを処理する必要がなければ、おそらくDateTime
をWCFインターフェイスに使用します。
現在、私は複合型(xs:dateTime
ので、それがないことを、すべての情報が含まれていることができるはず!)を使用しての賛成で見ることができる唯一の正当化xs:dateTime
が使用されていた場合DateTime
とDateTimeOffset
、WCFクライアントをシリアライズすることですどちらのタイプを使うのか分かりません。
脇に - DateTimeOffsetは実際には標準のISO8601に基づいています。推奨されるシリアライズ形式は、 '2012-02-07T07:17:00-05:00'のようになります。しかし、WCFがこれを適切に採用したかどうかは不明です。 –