2014-09-08 4 views
1

Lorsque j'effectue un appel JSON depuis AngularJS vers mon contrôleur WebApi via une requête GET, mes dates arrivent à mon modèle en tant que type 'Local'. C'est bien et comment je veux que ça fonctionne..NET WebApi Inconsistant DateTime Kind POST vs GET

Cependant, lorsque je change la méthode en POST (sur le contrôleur WebApi et sur mon code client AngularJS), les dates sont une heure, car le type DateTime est maintenant UTC. Les dates sont sérialisées via .toJSON() avant d'être envoyées et tout semble identique via l'inspection du réseau de Chrome lors de l'examen des requêtes GET et POST.

Comment puis-je garder le type DateTime cohérent entre les requêtes POST et GET afin qu'elles soient toujours locales?

Edit # 1:

Appel angulaire JS:

  var params = { 
       DateFrom: detail.from.toJSON(), 
       DateTo: detail.to.toJSON(), 
       Filters: detail.filters 
      }; 

      return http.post(window.urls.apiGetAllErrorsGraphData, params); 

Dans mon exemple actuel, la valeur de params.DateFrom = "2014-04-30T23: 00: 00.000Z", detail.from = 01/05/2014 en tant qu'objet Date JS. Dans ce cas, http.post est un service Angular que j'ai écrit et qui enveloppe essentiellement les appels HTTP.

Controller .NET WebAPI

[POST("api/errors/chart")] 
    [HttpPost] 
    [HttpOptions] 
    public IHttpActionResult GetAllErrorsGraphData([FromBody]AllErrorChartDetails details) 
    { 
     var results = chartDataService.GenerateAllErrorsData(details.DateFrom, details.DateTo, details.Filters); 

     return Ok(results.Select(x => new { date = x.Key, errors = x.Value })); 
    } 

J'utilise AttributeRouting si vous êtes curieux de ce que les attributs sont sur la méthode.

+0

Pouvez-vous montrer le code pertinent? – AWinkle

+0

Message original mis à jour. – Tom

+0

Je suppose que c'est votre format de date dans la requête GET. Pouvez-vous poster votre code pour cela? – tia

Répondre

0

Ne pouvez-vous pas simplement convertir l'objet DateTime lorsque vous le récupérez au format dont vous avez besoin?

DateTime json = yourJsonMethod(); 
json = json.ToLocalTime(); 
+0

Je pourrais deviner mais ceci est un peu hacky ne pensez-vous pas? Je vais devoir faire ceci ou quelque chose de similaire à travers toutes mes méthodes où j'ai eu besoin de convertir mes méthodes de GET à POST. – Tom

+0

Hacky n'est pas toujours une mauvaise chose :-) bien que si vous avez plusieurs méthodes où ce code est utilisé, cela peut être un problème. Pourrait également le faire en ligne: 'details.Date.ToLocalTime();' [Voir ici] (http://stackoverflow.com/questions/22581138/passing-utc-datetime-to-web-api-httpget- méthode-résultats-en-temps-local); On dirait qu'il peut y avoir aussi un moyen de rendre la conversion "transparente" alors peut-être que vous n'avez pas besoin de la méthode à chaque fois ... (Voir la réponse de Sean Fausett) –

+0

Je n'arrive pas à trouver la solution de Sean Fausett moi, les dates continuaient à venir comme Utc. Je ne peux pas m'empêcher de penser qu'il s'agit d'un bug dans le framework, je ne vois pas pourquoi vous voudriez que le type DateTime diffère entre les différentes méthodes HTTP. – Tom