2014-10-24 10 views
5

Sorgulamamda bir UTC tarihi gönderiyor, ör.WebApi querystring parametresi bağlamasının UTC tarihleri ​​nasıl saklanır?

& bitiştarihi = 2000-01-02T03% 3a04% 3a05.0060000Z

Ve kontrol parametresi karmaşık bir nesne, örneğin, onu bağlayan Ben anlamaya başardınız ne

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

parametre bağlama sonra benim nesne, ofset yerel tarihe + benim UTC tarih değiştirmesidir. İşte benim test davanın snippet'idir

[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); 
} 

çıkışı olduğu için yukarıdaki başarısız:

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

Ama Daha sonra json serileştirme ofseti keser ve UTC tarihi olduğunu varsayar ve görebildiğiniz gibi, tarihler gidiş-dönüş yolculuğuna uymaz.

Orada da benzer bir soru burada, ama gerçekten bir cevap (cevap afiş kendi soru)

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

Bu sorunu çözmek için doğru çözüm nedir ? Sorun şu ki, querystring'i UTC olarak bir tarih ayrıştırmak için parametre bağlamasının olmasını istiyorum. TypeConverter gitmek için bir yol mu? Bunun nasıl yapılacağı konusunda tam bir örnek var mı? DateTime ile tüm sınıflarımdaki tüm öznitelikte TypeConverter kullanmalı mıyım? Küresel bir çeşit konfigürasyonu umuyordum.

Teşekkürler.

+0

Bağladığınız soruyu iyi bir yanıtı buldum (ki bu sorudan önce ortaya çıkıyordu, ancak t'ye rağmen kabul edilen yanıt olarak işaretlenmedi) Bu arada en çok oyu alan): http://stackoverflow.com/a/24899562/125407 –

+0

olası [Kopyalama UTC DateTime Web API HttpGet Metodu sonuçlarına yerel saatte] (http: // stackoverflow.com/questions/22581138/geçirme-utc-datetime-to-web-api-httpget-yöntem-yerel-zaman-sonuç) –

cevap

3

Benzer bir sorunu DateTimeOffset sınıfı yerine DateTime kullanarak çözdüm. Bu cevaba bakınız: Ek alanda

DateTime vs DateTimeOffset

DateTimeOffset sınıfı saklar saat dilimi bilgilerini. Yani, veri modeli sınıfınızı DocumentsRequest ve DateTimeOffset kullanın.

Sonraki, WebAPI biçimlendiricinizi tarayıcıyla eşitlemelisiniz. Aşağıdaki ayarlarla Newtonsoft.Json kütüphane kullanın:

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

Ve WebAPI kayıt sınıfında bu ayarları kayıtlı: Tarayıcının yan kullanımı ISO tarih saat biçimine,

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

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

Ve:

ISO date time format in WWW

+0

Ayrıca bkz. 'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; –