2014-10-24 16 views
5

Sto inviando il mio querystring una data UTC, ad es.Come mantenere il binding dei parametri queryys di WebApi per mantenere le date UTC?

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

E mia parametro regolatore vincola in un oggetto complesso, ad esempio

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

Quello che sono riuscito a capire è che il mio oggetto dopo il binding dei parametri, cambia la mia data UTC in una data locale + offset. Ecco un frammento del mio banco di prova

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

È possibile che questo sta fallendo perché l'output è:

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

Ma , la serializzazione json quindi tronca l'offset e presuppone che sia la data UTC ... e come puoi vedere, le date non corrispondono al post-round-trip.

C'è una domanda simile qui, ma non è davvero una risposta (il manifesto rispondere è proprio questione)

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

Qual è la soluzione giusta per risolvere questo problema? Penso che il problema è che voglio che il parametro binding per analizzare la querystring come una data UTC. TypeConverter è la strada da percorrere? Qualcuno ha un esempio completo di come farlo? Dovrei usare il TypeConverter su tutti gli attributi su tutte le mie classi con DateTime? Speravo in una configurazione globale di sorta.

Grazie.

+0

Ho trovato la domanda che hai collegato ha una buona risposta (che appare creata prima della tua domanda, ma non è stata contrassegnata come risposta accettata nonostante abbia t più vota nel frattempo): http://stackoverflow.com/a/24899562/125407 –

+0

possibile duplicato di [Passing UTC DateTime in Web API HttpGet Metodo risultati in ora locale] (http: // stackoverflow.it/questions/22581138/passing-utc-datetime-to-web-api-httpget-method-results-in-local-time) –

risposta

3

Ho risolto un problema simile utilizzando la classe DateTimeOffset invece di DateTime. Si prega di guardare a questa risposta:

DateTime vs DateTimeOffset

negozi di classe DateTimeOffset le informazioni sul fuso orario nel campo aggiuntivo. Pertanto, è necessario modificare la classe del modello di dati DocumentsRequest e utilizzare DateTimeOffset.

Successivamente, è necessario sincronizzare il formattatore WebAPI con il browser. Io uso biblioteca Newtonsoft.Json con le seguenti impostazioni:

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

E ho registrato queste impostazioni nella classe di registrazione WebAPI:

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

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

E, sul formato di utilizzo lato ora data ISO del browser:

ISO date time format in WWW

+0

Vedere anche 'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;' –