2014-10-24 5 views
5

내 쿼리 문자열에 UTC 날짜 (예 :WebApi querystring 매개 변수 바인딩을 유지하는 방법은 UTC 날짜를 유지합니까?

& 종료 날짜 = 2000-01-02T03 % 3a04 % 3a05.0060000Z

그리고 내 제어기 파라미터는 복잡한 객체, 예를 들어에 바인드

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

매개 변수 바인딩 후 내 개체가 내 UTC 날짜를 로컬 날짜 + 오프셋으로 변경한다는 점을 알아 냈습니다. 여기 내 테스트 케이스의 조각이

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

다음은 출력이기 때문에 위의 실패 :

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

그러나 json serialization은 오프셋을 잘라 버리고 UTC 날짜라고 가정합니다 ... 그리고 알 수 있듯이 날짜는 post-round-trip과 일치하지 않습니다.

이 비슷한 질문이 여기에있다,하지만 정말 대답 (대답 포스터가 자신의 질문은)

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

이 문제를 해결하려면 올바른 해결책은 무엇인가 ? 문제는 매개 변수 바인딩이 쿼리 문자열을 UTC로 구문 분석하도록하려는 것입니다. TypeConverter가는 길입니까? 누구든지 그 방법에 대한 완전한 견본을 가지고 있습니까? DateTime과 함께 모든 클래스의 모든 특성에 TypeConverter를 사용해야합니까? 전 세계적으로 일종의 구성을 원했습니다.

감사합니다.

+0

내가 링크 된 질문에 답을 얻은 적이 있습니다. (질문 전에 작성되었지만 나타 났지만 답이 표시되지 않았습니다. 그는 그 사이에 대부분 투표) : http://stackoverflow.com/a/24899562/125407 –

+0

가능한 복제본 [UTC DateTime을 Web API에 전달하면 HttpGet Method는 현지 시간으로 결과를 얻습니다.] (http : // stackoverflow.com/questions/22581138/passing-utc-datetime-to-web-api-httpget-method-results-in-local-time) –

답변

3

DateTime 대신 DateTimeOffset 클래스를 사용하여 유사한 문제를 해결했습니다. 이 답변에보고하십시오 추가 필드에서

DateTime vs DateTimeOffset

을 DateTimeOffset 클래스를 저장 시간대 정보를. 따라서 데이터 모델 클래스 인 DocumentsRequest를 변경하고 DateTimeOffset을 사용해야합니다.

다음으로 WebAPI 포맷터를 브라우저와 동기화해야합니다. 나는 다음과 같은 설정으로 Newtonsoft.Json 라이브러리를 사용 :

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

그리고 나는 WebAPI 등록 클래스에서이 설정 등록 : 브라우저의 측면을 사용 ISO 날짜 시간 형식에

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

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

을 그리고 :

ISO date time format in WWW

+0

또한보십시오'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; –