2014-10-24 8 views
5

मैं अपनी क्वेरीस्ट्रिंग में एक यूटीसी तिथि भेज रहा हूं, उदा।WebApi querystring पैरामीटर बाध्यकारी कैसे UTC तिथियां रखने के लिए?

& EndDate = 2000-01-02T03% 3a04% 3a05.0060000Z

और मेरे नियंत्रक पैरामीटर एक जटिल वस्तु है, उदा यह बांधता

public async Task<DocumentsRequest> GetEchoFromUriDocumentsAsync(
              [FromUri] DocumentsRequest request) 
    { 
     return request; 
    } 

जो मैंने समझने में कामयाब रहा है वह है कि पैरामीटर बाध्यकारी के बाद मेरी वस्तु, मेरी यूटीसी तिथि को स्थानीय दिनांक + ऑफसेट में बदल देती है। यहाँ मेरी परीक्षण मामले का एक टुकड़ा है

[TestMethod] 
    public void Should_generate_querystring_and_parameter_bind_correctly() 
    { 

     DocumentsRequest request = DocumentRequestBuilder.DocumentsRequest(); 
     string queryString = ReflectionQueryStringConverter.ToQueryString(request); 

     string baseUrl = "http://baseUrl/Test/EchoFromUriDocuments"; 
     string uri = baseUrl + queryString; 
     HttpResponseMessage response = _client.GetAsync(uri).Result; 
     string outputString = response.Content.ReadAsStringAsync().Result; 

     JsonSerializer<DocumentsRequest> serializer = 
      new JsonSerializer<DocumentsRequest>(); 
     DocumentsRequest output = serializer.DeserializeFromString(outputString); 

     output.EndDate.Should().Be(request.EndDate); 
} 

क्योंकि उत्पादन होता है ऊपर विफल हो रहा है:

2000-01-01T19: 04: 05.006-08: 00

लेकिन , जेसन सीरियलाइजेशन ऑफसेट को छोटा कर देता है और मानता है कि यह यूटीसी तिथि है ... और जैसा कि आप देख सकते हैं, तिथियां पोस्ट-राउंड-ट्रिप से मेल नहीं खाती हैं।

वहाँ एक समान प्रश्न यहाँ है, लेकिन वास्तव में नहीं एक जवाब (पोस्टर जवाब ही सवाल है)

Passing UTC DateTime to Web API HttpGet Method results in local time

इस समस्या को हल करने के लिए सही समाधान क्या है? मुझे लगता है कि मुद्दा यह है कि मैं यूआरसी के रूप में क्वेरीस्ट्रिंग को पार्स करने के लिए बाध्यकारी पैरामीटर चाहता हूं। टाइप कनवर्टर जाने का रास्ता है? किसी के पास यह कैसे करना है इसका पूरा नमूना है? क्या मुझे डेटटाइम के साथ अपने सभी वर्गों पर सभी विशेषताओं पर TypeConverter का उपयोग करना होगा? मैं एक वैश्विक विन्यास की उम्मीद कर रहा था।

धन्यवाद।

+0

मुझे पता चला कि आपके द्वारा लिंक किया गया एक अच्छा जवाब है (जो आपके प्रश्न से पहले बनाया गया था, लेकिन टी के बावजूद स्वीकृत उत्तर के रूप में चिह्नित नहीं किया गया था इस दौरान वह सबसे अधिक वोट): http://stackoverflow.com/a/24899562/125407 –

+0

संभावित डुप्लिकेट [वेब एपीआई दिनांक यूटीपी डेटटाइम को वेब एपीआई एचटीपीजीट विधि के परिणाम स्थानीय समय में परिणाम] (http: // stackoverflow।कॉम/प्रश्न/22581138/पासिंग-यूटीसी-डेटाटाइम-टू-वेब-एपीआई-httpget-method-results-in-local-time) –

उत्तर

3

मैंने डेटटाइम के बजाय डेटटाइम ऑफसेट क्लास का उपयोग करके इसी तरह की समस्या हल की है। इस उत्तर के लिए तत्पर करें: अतिरिक्त क्षेत्र में

DateTime vs DateTimeOffset

DateTimeOffset वर्ग भंडार अपना समय क्षेत्र जानकारी। इसलिए, आपको अपना डेटा मॉडल क्लास DocumentsRequest बदलना चाहिए और डेटटाइम ऑफसेट का उपयोग करना चाहिए।

अगला, आपको ब्राउज़र के साथ अपने वेबएपीआई फॉर्मेटर को सिंक्रनाइज़ करना चाहिए। मैं निम्नलिखित सेटिंग्स के साथ Newtonsoft.Json पुस्तकालय का उपयोग करें:

var jsonSettings = new JsonSerializerSettings 
{ 
    // Note the ISO format 
    DateFormatHandling = DateFormatHandling.IsoDateFormat, 
    DefaultValueHandling = DefaultValueHandling.Include, 
    TypeNameHandling = TypeNameHandling.Auto 
} 

और मैं वेबएपीआई पंजीकरण कक्षा में इस सेटिंग पंजीकृत:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     ... 

     config.Formatters.Remove(config.Formatters.XmlFormatter); 
     config.Formatters.JsonFormatter.SerializerSettings = jsonSettings; 
    } 
} 

और, ब्राउज़र की ओर उपयोग आईएसओ तिथि समय प्रारूप पर:

ISO date time format in WWW

+0

यह भी देखें 'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; ' –

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