2012-02-07 9 views
6

私は、DateTimeOffsetを取るいくつかの操作規約を持つ.NET WCFサービスを持っています。この考え方は、DSTとタイムゾーンの混乱を避けることです。WCF DateTimeOffsetの互換性

しかし、DateTimeOffsetを使用することは結構いいことです。結局のところ非標準的で、Javaアプリケーションや.NETアプリケーションに接続しようとする人にとって頭痛の種になるからです。古い.NETバージョン。

これに代わる方法として、UTCのDateTimeが必要ですが、これにより、誰かがUTC時間を使用してローカル時間でサービスを呼び出すことを忘れるリスクが発生します。 クライアントは常に同じタイムゾーンにあるので、ローカルタイムDateTimeも期待できますが、DSTの変更についてはあまり微妙ではなく古典的なあいまいさが残ります。

サービスインターフェイスでDateTimeOffsetを使用している人は誰もいませんか?結局のところ、使用するのは比較的問題ありませんか?

+0

脇に - DateTimeOffsetは実際には標準のISO8601に基づいています。推奨されるシリアライズ形式は、 '2012-02-07T07:17:00-05:00'のようになります。しかし、WCFがこれを適切に採用したかどうかは不明です。 –

答えて

1

IMHO WCFサービスでDateTimeを使用する上で最も大きな頭痛は、WCFが現在xs:Dateをサポートしていないことです。this related questionおよびリンクされたConnectの提案を参照してください。

DateTimeOffsetはこの問題の解決に役立ちません。

+0

また、DateTimeOffsetの問題は実際にはこの問題に関連していません。 – hangy

8

私は現在インフラストラクチャの一部をWCFに変更しており、この未解決の問題に遭遇し、試してみることにしました。 :)

WCFがDateTimeDateTimeOffsetをシリアル化する方法はちょっと変わったようです。他のプラットフォームを使用する際は、次のサンプルが示すように、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が使用されていた場合DateTimeDateTimeOffset、WCFクライアントをシリアライズすることですどちらのタイプを使うのか分かりません。