2014-10-24 18 views
5

Wysyłam moje zapytanie o datę UTC, np.Jak ustawić powiązanie parametrów WebApi, aby zachować daty UTC?

& DataZakończenia = 2000-01-02T03% 3a04% 3a05.0060000Z

i moje Parametry regulatora wiąże się w złożonym obiektu, np

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

Udało mi się ustalić, że mój obiekt po powiązaniu parametrów zmienia datę UTC na lokalną datę + przesunięcie. Oto fragment mojego przypadku testowego

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

Powyższy się niepowodzeniem, ponieważ wyjście jest:

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

Ale , serializacja json następnie obcina offset i zakłada, że ​​jest data UTC ... i jak widać, daty nie pasują do potoku po podróży.

Jest tu podobne pytanie, ale naprawdę nie odpowiedź (plakat odpowiedział ma własne pytanie)

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

Jaki jest prawidłowe rozwiązanie, aby rozwiązać ten problem? Myślę, że problem polega na tym, że chcę, aby powiązanie parametrów przeanalizowało querystring jako datę UTC. Czy TypeConverter jest drogą? Ktoś ma pełną próbkę tego, jak to zrobić? Czy musiałbym używać TypeConverter we wszystkich atrybutach na wszystkich moich zajęciach z DateTime? Miałem nadzieję na globalną konfigurację.

Dzięki.

+0

Znalazłem pytanie, które połączyłeś, ma dobrą odpowiedź (która pojawi się została utworzona przed Twoim pytaniem, ale nie została oznaczona jako zaakceptowana odpowiedź mimo on ma najwięcej głosów w międzyczasie): http://stackoverflow.com/a/24899562/125407 –

+0

możliwy duplikat [Przechodzenie UTC DateTime do Web API HttpGet Metoda wyniki w czasie lokalnym] (http: // stackoverflow.com/questions/22581138/passing-utc-datetime-to-web-api-httpget-method-results-in-local-time) –

Odpowiedz

3

Rozwiązałem podobny problem, używając klasy DateTimeOffset zamiast DateTime. Proszę spojrzeć na to odpowiedź:

DateTime vs DateTimeOffset

przechowuje klasy datetimeoffset swoją strefę czasową w dodatkowym polu. Dlatego należy zmienić klasę modelu danych DocumentsRequest i użyć DateTimeOffset.

Następnie należy zsynchronizować formater WebAPI z przeglądarką. Używam biblioteki Newtonsoft.Json z następującymi ustawieniami:

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

I zarejestrował ustawienia w klasie rejestracji WebAPI:

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

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

I, na stosowanie formatu strona data ISO czasowej przeglądarki:

ISO date time format in WWW

+0

Zobacz także 'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;' –

Powiązane problemy