2012-02-21 20 views
6

Tôi di chuyển một phương thức API từ một hành động MVC tiêu chuẩn sang API Web.net asp.net mới và đột nhiên thuộc tính chỉ đọc không còn được tuần tự hóa (cả trả về JSON). Đây có phải là hành vi mong đợi không?ASP.NET Web-API không tuần tự hóa thuộc tính chỉ đọc

Chỉnh sửa: Thêm mẫu mã

Tôi có cả Newtonsoft.Json 4.0.8 và System.Json 4,0 tham chiếu thông qua gói NuGet

 public IQueryable<Car> Gets() 
     { 
      return _carRepository.GetCars(); 
     } 

     public class Car 
     { 
      public IEnumerable<Photo> Photos 
      { 
       get { return _photos; } 
      } 

      public string PreviewImageUrl // No longer serialized 
      { 
       get 
       { 
        var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault(); 
         return mainImage != null ? mainImage.Url : (string.Empty); 
        } 
       } 
      } 
     } 
+0

không mong đợi. bạn có thể đăng một số mã repros vấn đề. – marcind

+0

Trình serializer JSON nào bạn đang sử dụng? –

Trả lời

10

JsonMediaTypeFormatter đi kèm với bản Beta sử dụng bộ nối tiếp không hỗ trợ các thuộc tính chỉ đọc (vì chúng sẽ không làm tròn chính xác). Chúng tôi đang có kế hoạch giải quyết vấn đề này cho những người theo sau.

Trong thời gian trung bình, bạn có thể sử dụng tùy chỉnh JSON MediaTypeFormatter triển khai sử dụng Json.NET (có sẵn here) thay vì trình định dạng tích hợp sẵn.

Cập nhật: Ngoài ra kiểm tra blog của Henrik về hooking lên một formatter JSON.NET: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

+1

Chỉ cần nâng cấp lên bản phát hành RC và điều này vẫn có vẻ là một vấn đề. Chỉ cần tò mò nếu mọi thứ sẽ thay đổi trước khi phát hành cuối cùng hoặc chúng ta nên chỉ không mong đợi các thuộc tính chỉ đọc được serialized? Cảm ơn! –

+0

Bạn có thể thử bản dựng hàng đêm mới nhất (hướng dẫn: http://aspnetwebstack.codeplex.com/discussions/353867). Ngoài ra, hãy đảm bảo rằng bạn thực sự đã gỡ cài đặt các bit Beta khỏi hệ thống của mình. Nếu nó vẫn là một vấn đề bạn có thể đăng một repro ở đây: http://aspnetwebstack.codeplex.com/. Cảm ơn. – marcind

+0

Tôi đã gỡ cài đặt phiên bản beta và cài đặt RC, nhưng đã bỏ qua để cập nhật các gói của dự án với nuget, vì vậy tôi vẫn đang sử dụng các bit beta. Sau khi cập nhật, thuộc tính chỉ đọc được tuần tự hóa bằng JSON, nhưng không phải là XML. Vì mục đích của tôi, JSON là tất cả những gì tôi cần, vì vậy tôi tốt, nhưng có vẻ như nó sẽ hoạt động giống với việc tuần tự hóa XML? –

4

Tôi không biết nếu điều này là một hành vi mong đợi hay không phải. Tôi sẽ nói rằng điều này được mong đợi cho các tham số đầu vào (vì bạn không thể đặt giá trị của chúng) nhưng không cho các tham số đầu ra. Vì vậy, tôi sẽ nói đây là một lỗi cho một tham số đầu ra. Và đây là một ví dụ minh họa vấn đề này:

mẫu:

public class Product 
{ 
    public Product() 
    { 
     Prop1 = "prop1 value"; 
     Prop2 = "prop2 value"; 
     Prop3 = "prop3 value"; 
    } 

    public string Prop1 { get; set; } 

    [ReadOnly(true)] 
    public string Prop2 { get; set; } 

    public string Prop3 { get; protected set; } 
} 

Bộ điều khiển:

public class ProductsController : ApiController 
{ 
    public Product Get(int id) 
    { 
     return new Product(); 
    } 
} 

Yêu cầu:

api/products/5 

Kết quả:

{"Prop1":"prop1 value","Prop2":"prop2 value"} 

Vì vậy, nếu thuộc tính không có bộ công khai, nó không được tuần tự hóa mà không có vẻ bình thường vì lớp Product được sử dụng làm đầu ra trong trường hợp này.

Tôi khuyên bạn nên mở một thẻ kết nối để Microsoft có thể sửa lỗi này trước khi phát hành hoặc ít nhất là nói rằng điều này là do thiết kế.

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