2014-10-24 14 views
5

Tôi đang gửi chuỗi truy vấn của mình vào ngày UTC, ví dụ:Làm thế nào để có tham số chuỗi truy vấn WebApi giữ ngày UTC?

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

Và thông số điều khiển của tôi liên kết với nó trong một đối tượng phức tạp, ví dụ

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

Điều tôi đã tìm hiểu là đối tượng của tôi sau khi ràng buộc tham số, thay đổi ngày UTC thành ngày bù trừ + ngày địa phương. Dưới đây là một đoạn trường hợp thử nghiệm của tôi

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

Trên đây là thất bại vì đầu ra là:

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

Nhưng , tuần tự json sau đó cắt ngắn bù đắp và giả định nó là ngày UTC ... và như bạn có thể thấy, những ngày không phù hợp lên sau chuyến đi vòng.

Có một câu hỏi tương tự ở đây, nhưng không thực sự là một câu trả lời (các poster đã trả lời là câu hỏi của riêng)

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

giải pháp đúng để giải quyết vấn đề này là gì? Tôi nghĩ rằng vấn đề là tôi muốn tham số ràng buộc để phân tích chuỗi truy vấn như UTC một ngày. Có phải TypeConverter là con đường để đi? Bất cứ ai có một mẫu hoàn chỉnh làm thế nào để làm điều đó? Tôi có phải sử dụng TypeConverter trên tất cả các thuộc tính trên tất cả các lớp của tôi với DateTime không? Tôi đã hy vọng cho một cấu hình toàn cầu của các loại.

Cảm ơn.

+0

Tôi đã tìm thấy câu hỏi bạn đã liên kết có câu trả lời hay (xuất hiện trước khi bạn đặt câu hỏi nhưng không được đánh dấu là câu trả lời được chấp nhận mặc dù có hầu hết các phiếu bầu trong thời gian chờ đợi): http://stackoverflow.com/a/24899562/125407 –

+0

có thể trùng lặp của [Chuyển UTC DateTime thành Web API HttpGet Phương thức kết quả theo giờ địa phương] (http: // stackoverflow.com/questions/22581138/passing-utc-datetime-to-web-api-httpget-method-results-in-local-time) –

Trả lời

3

Tôi đã giải quyết vấn đề tương tự bằng cách sử dụng lớp DateTimeOffset thay vì DateTime. Hãy nhìn vào câu trả lời này:

DateTime vs DateTimeOffset

cửa hàng lớp DateTimeOffset thông tin múi giờ của bạn trong lĩnh vực bổ sung. Vì vậy, bạn nên thay đổi lớp mô hình dữ liệu của bạn DocumentsRequest và sử dụng DateTimeOffset.

Tiếp theo, bạn nên đồng bộ hóa trình định dạng WebAPI của mình với trình duyệt. Tôi sử dụng thư viện Newtonsoft.Json với các cài đặt sau:

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

Và tôi đã đăng ký cài đặt này trong lớp đăng ký WebAPI:

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

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

Và, trên định dạng sử dụng mặt thời gian ngày ISO của trình duyệt:

ISO date time format in WWW

+0

Xem thêm 'config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;' –

Các vấn đề liên quan