2014-10-24 18 views
5

Ich sende in meinem Querystring ein UTC-Datum, z.B.Wie WebApi Querystring Parameter Bindung haben UTC-Daten zu halten?

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

Und mein Controller Parameter bindet es in einem komplexen Objekt, z.B.

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

Was ich herausgefunden habe ist, dass mein Objekt nach der Parameterbindung mein UTC-Datum auf ein lokales Datum + Offset ändert. Hier ist ein Ausschnitt aus meinem Testfall

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

Die oben versagt, weil der Ausgang ist:

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

Aber Die json-Serialisierung schneidet dann den Offset ab und nimmt an, dass es sich um ein UTC-Datum handelt ... und wie Sie sehen, stimmen die Daten nicht mit dem Post-Round-Trip überein.

Es gibt eine ähnliche Frage hier, aber nicht wirklich eine Antwort (das Plakat beantwortet ist eigene Frage)

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

Was ist die richtige Lösung, um dieses Problem zu lösen? Ich denke, das Problem ist, dass ich will, dass die Parameterbindung die Querystring als UTC ein Datum analysiert. Ist TypeConverter der richtige Weg? Jeder hat eine vollständige Probe, wie man das macht? Muss ich den TypeConverter für alle Attribute in allen meinen Klassen mit DateTime verwenden? Ich habe auf eine globale Konfiguration gehofft.

Danke.

+0

Ich fand die Frage, die Sie verknüpft haben, eine gute Antwort (die erscheint, wurde vor Ihrer Frage erstellt, wurde aber nicht als die angenommene Antwort trotz t markiert Die meisten Stimmen in der Zwischenzeit): http://stackoverflow.com/a/24899562/125407 –

+0

mögliche Duplikate von [Übergabe von UTC DateTime an Web API HttpGet Methode ergibt lokale Zeit] (http: // stackoverflow.com/questions/22581138/passing-utc-datetime-zu-web-api-httpget-methode-result-in-local-time) –

Antwort

3

Ich habe ähnliche Probleme gelöst, indem ich die DateTimeOffset-Klasse anstelle von DateTime verwende. Bitte schauen Sie auf diese Antwort:

DateTime vs DateTimeOffset

Datetime Klasse speichert Ihre Zeitzoneninformationen in zusätzliches Feld. Daher sollten Sie Ihre Datenmodellklasse DocumentsRequest ändern und DateTimeOffset verwenden.

Als nächstes sollten Sie Ihren WebAPI-Formatierer mit dem Browser synchronisieren. Ich benutze Newtonsoft.Json Bibliothek mit den folgenden Einstellungen:

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

Und ich registrierte diese Einstellungen in der WebAPI Registrierungsklasse:

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

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

und auf der Seite Verwendung ISO Datum Zeitformat des Browsers:

+0

Siehe auch 'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;' –