2013-07-16 35 views
10

Tôi đang sử dụng một ApiController sử dụng lớp HttpConfiguration toàn cục để chỉ định cài đặt JsonFormatter. Tôi có thể thiết lập cài đặt tuần tự hóa toàn cầu như sau rất dễ dàng:Cài đặt bộ nối tiếp Json.NET tùy chỉnh theo loại

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 

Vấn đề là không phải tất cả các cài đặt đều áp dụng cho tất cả các loại trong dự án của tôi. Tôi muốn chỉ định tùy chọn TypeNameHandling và Binder tùy chỉnh cho các loại cụ thể thực hiện tuần tự đa hình.

Làm cách nào để chỉ định JsonFormatter.SerializationSettings trên mỗi loại hoặc ít nhất trên cơ sở cho mỗi ApiController?

+1

Đối apicontroller dựa cấu hình, bạn có thể có một cái nhìn tại tính năng cấu hình cho mỗi bộ điều khiển: http : //blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx. bài đăng này là bài đăng cũ, nhưng hầu hết nội dung đều có liên quan đến các bit mới nhất. –

+0

Tôi đã thử sử dụng cấu hình trên mỗi bộ điều khiển bằng thuộc tính IControllerConfiguration như bạn đã đề xuất. Các thiết lập mà tôi đang chỉ định trong hàm Initialize cho JsonFormatter đang thực sự được sử dụng lại bởi các yêu cầu và đang được áp dụng cho các bộ điều khiển khác. Tôi chỉ áp dụng thuộc tính cho một bộ điều khiển cụ thể. Điều này có vẻ như một lỗi. –

Trả lời

12

Dựa trên nhận xét của bạn ở trên, sau đây là một ví dụ về cấu hình cho mỗi bộ điều khiển:

[MyControllerConfig] 
public class ValuesController : ApiController 

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
public class MyControllerConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) 
    { 
     //remove the existing Json formatter as this is the global formatter and changing any setting on it 
     //would effect other controllers too. 
     controllerSettings.Formatters.Remove(controllerSettings.Formatters.JsonFormatter); 

     JsonMediaTypeFormatter formatter = new JsonMediaTypeFormatter(); 
     formatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.All; 
     controllerSettings.Formatters.Insert(0, formatter); 
    } 
} 
+0

Bạn có nghĩ rằng bạn có thể chỉ cho tôi đúng hướng để làm cho đối số này hoạt động theo Phương pháp điều khiển không? – WillFM

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