2012-02-07 16 views
6

मेरे पास कुछ ऑपरेशन अनुबंधों के साथ एक .NET WCF सेवा है जो डेटटाइम ऑफसेट लेता है। विचार डीएसटी और समय क्षेत्र के साथ किसी भी भ्रम से बचने के लिए है।डब्ल्यूसीएफ डेटटाइम ऑफसेट अनुकूलता

हालांकि मुझे संदेह है कि डेटटाइम ऑफसेट का उपयोग करना एक अच्छा विचार है, क्योंकि यह काफी गैर-मानक है और किसी के लिए कनेक्ट करने का प्रयास करने वाले किसी भी व्यक्ति के लिए सिरदर्द का कारण बनता है, कहता है, एक जावा एप्लिकेशन या एक .NET अनुप्रयोग पुराना .NET संस्करण।

एक विकल्प यूटीसी डेटटाइम की अपेक्षा करना है, लेकिन इससे जोखिम उत्पन्न होता है कि कोई यूटीसी समय का उपयोग करना भूल जाएगा और स्थानीय समय के साथ सेवा को कॉल करेगा। मैं स्थानीय समय दिनांक समय की अपेक्षा भी कर सकता हूं, क्योंकि ग्राहक हमेशा एक ही समय क्षेत्र में रहेंगे, लेकिन यह कुछ सूक्ष्म, लेकिन क्लासिक, डीएसटी परिवर्तनों के आसपास अस्पष्टता छोड़ देता है।

क्या किसी के पास किसी सेवा इंटरफ़ेस में डेटटाइम ऑफसेट के साथ सिरदर्द कहानियां हैं या क्या यह अपेक्षाकृत अप्रचलित है?

+0

एक तरफ के रूप में - डेटटाइम ऑफसेट वास्तव में मानक - ISO8601 द्वारा समर्थित है। पसंदीदा क्रमबद्धता प्रारूप इस तरह दिखता है: '2012-02-07T07: 17: 00-05: 00'। लेकिन मुझे यकीन नहीं है कि डब्ल्यूसीएफ ने कभी इसे सही तरीके से अपनाया है या नहीं। –

उत्तर

1

आईएमएचओ डब्लूसीएफ सेवा के साथ डेटटाइम का उपयोग करने में सबसे बड़ा सिरदर्द यह है कि डब्ल्यूसीएफ वर्तमान में एक्सएस का समर्थन नहीं करता है: दिनांक - this related question और लिंक किए गए कनेक्ट सुझाव देखें।

डेटटाइम ऑफसेट इस समस्या से मदद नहीं करता है।

+0

लेकिन साथ ही, डेटटाइम ऑफसेट समस्या वास्तव में इस से संबंधित नहीं है। – hangy

8

मैं वर्तमान में डब्ल्यूसीएफ को हमारे कुछ बुनियादी ढांचे को बदल रहा हूं और इस अनुत्तरित प्रश्न पर ठोकर खा रहा हूं और इसे आजमाने का फैसला किया। :)

डब्ल्यूसीएफ 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; } 
} 

अनुरोध की प्रतिक्रिया एक्सएमएल है:

<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 समय क्षेत्र में कर रहा हूँ , तो मूल्य सही के बारे में प्रतीत होता है। यह इस तरह क्यों है? खैर, डबल्यूएसडीएल को परिभाषित करता है Container इस तरह:

<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> 

तो बुनियादी तौर पर, DateTime एक मानक के रूप में xs:dateTime (जो सही समय क्षेत्र है धारावाहिक है:

<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 - - डबल्यूएसडीएल में के रूप में परिभाषित किया गया है घटक) और DateTimeOffset को गैर-मानक जटिल प्रकार में क्रमबद्ध किया गया है, जिसे कॉलर को सही ढंग से समझना और संभालना होगा।

FWIW; चूंकि मुझे यह पता चला, मैं शायद डब्ल्यूसीएफ इंटरफ़ेस के लिए DateTime का उपयोग करूंगा जब तक कि मुझे वास्तव में अलग-अलग टाइमज़ोन ऑफसेट की देखभाल करने की आवश्यकता न हो।

वर्तमान में, केवल औचित्य मैं जटिल प्रकार (xs:dateTime के बाद से सभी जानकारी है कि यह करता है को रोकने के लिए सक्षम होना चाहिए!) का उपयोग कर के पक्ष में देख सकता था कि DateTime और DateTimeOffset, एक WCF ग्राहक को क्रमानुसार करने अगर xs:dateTime इस्तेमाल किया गया था है पता नहीं होगा कि किस प्रकार का उपयोग करना है।

संबंधित मुद्दे